1

我有列表列表(列表行包含列表列)。我想按长度(.size())对 ListRZS 中的行进行排序。

[[123, 189, 277], [11], [145, 211, 299], [156, 222, 310], [167, 233, 255], [189, 266], [200, 277], [211, 288], [245, 299], [233], [244]]

Shoul be:
[[11], [233], [244], [189, 266],[200, 277], [211, 288], [245, 299], [123, 189, 277], [145, 211, 299], [156, 222, 310], [167, 233, 255]]

问题:如何为这种情况编写工作比较器/可比较。

public class Start {
public static void main(String[] args) {
    System.out.println("Start reading from Xls");
    ReaderXls1Column read = new ReaderXls1Column();
    ReaderXls readrzs = new ReaderXls();
    List<String> listASU = new ArrayList<String>(read.ReaderXls1Column("Text1obj",0,1));                        // Creating Lists
    List<List<String>>  listRZS = new ArrayList<List<String>>(readrzs.ReadXls("Text1obj",2,12));
    System.out.println(listASU);
    System.out.println(listRZS);
    System.out.println("Reading is over");
    System.out.println(listRZS);
    WriterXls.main("Text1obj",listRZS);
    System.out.println("Writing is over");
}

我没有比较器的尝试,可比较(当然,不能正常工作)

        int k=0;
    while ( k<listRZS.size()){
        for (int j=0;j<10;j++)     {
            List<String> tmplist = new ArrayList<String>();
            if (listRZS.get(k).size()>listRZS.get(k+1).size()) {Collections.copy(listRZS.get(k),tmplist); listRZS.remove(k); listRZS.add(k+1,tmplist);}
            else {};
        }
        Collections.sort(listRZS.get(k));       // sort each row, solution above
        k++;
    }
4

2 回答 2

2

比较只需要实现一个方法 ( compare),它需要两个项目,然后返回:

  • 0 如果它们相等
  • 如果第二个小于第一个,则为正值
  • 如果第二个大于第一个,则为负值。

在对整数值进行排序时,实现此目的的典型模式是将compare方法中接收到的每个对象减少为整数,然后,如果我们调用它们aand b,只需返回a - b

示例(在ideone.com/rcmDbi上运行):

import java.util.*;

class Test {

    public static void main(String[] args) {
        List<Integer> a = Arrays.asList(1);
        List<Integer> b = Arrays.asList(1,2);
        List<Integer> c = Arrays.asList(1,2,3);
        List<Integer> d = Arrays.asList(1,2,3,4);

        List<List<Integer>> test = Arrays.asList(d,b,c,a);
        Collections.sort(test, ListSizeComparator.INSTANCE);
        for (List<Integer> list : test) {
            System.out.println(list.size());
        }
    }

    enum ListSizeComparator implements Comparator<List> {
        INSTANCE;

        public int compare(List one, List other) {
            return one.size() - other.size();
        }
    }
}

(顺便说一句,我使用枚举作为枚举单例模式,因为我们的 Comparator 不存储任何状态。)

于 2013-08-13T05:25:21.120 回答
1

试试这样:

List<List<String>>  myList; // load myList with values

然后进行如下排序:

 Collections.sort(myList, new Comparator<List<String>>(){

    @Override
    public int compare(List<String> arg0, List<String> arg1) {

        return arg1.size() - arg0.size();
    }

    });
于 2013-08-13T05:35:15.477 回答