列表<列表<对象>&GT;排序

时间:2016-05-05 05:53:51

标签: java arraylist comparator

我在排序List<List<Object>>时遇到了问题。我创建了一个自定义比较器,我已经编写了代码来对数据进行排序。

 public class CustomComparator implements Comparator<List<Object>> 
    {
    static int i = 0;
    public int compare(List<Object> o1, List<Object> o2) {
            if (i < o1.size()) {
                System.out.println(i);
                Object obj1 = o1.get(i);
                Object obj2 = o2.get(i);
                if (obj1 != null && obj2 != null) {
                    int value = compareTo(obj1.toString(), obj2.toString());
                    if (value == 0) {
                        i++;
                        compare(o1, o2);
                    }
                    return value;
                }
                if (obj1 == null && obj2 != null) {
                    return -1;
                }
                if (obj1 != null && obj2 == null) {
                    return 1;
                }
                if (obj1 == null && obj2 == null) {
                    i++;
                    compare(o1, o2);
                }
            }
            else{
                i=0;
            }
        return 0;
    }

    public int compareTo(String value1, String value2) {
        return value1.compareTo(value2);
    }
}

我想要实现的逻辑是,首先它会尝试在第0个位置对Object进行排序。如果第0个位置的值相等或为null,则它将使用第2个位置的对象进行排序。等等。 如果其中任何一个值为null,那么该元素将向下移动。 但是,当我尝试使用我编写的代码进行排序时,它会得到排序,但不能按升序或降序排序。它只是洗牌了。

3 个答案:

答案 0 :(得分:0)

在这里使用递归是没有意义的。只需在循环中迭代两个List来比较它们的元素。

由于您忽略了递归调用返回的值,因此递归实现不起作用。使用静态变量来保持索引也是一个坏主意。如果两个线程同时使用Comparator实例会发生什么?

答案 1 :(得分:0)

试试这个,

public int compare(List<Object> o1, List<Object> o2) {
   public int compare(List<Object> o1, List<Object> o2) {
      int i=0;
      //TODO validation here for null check
      while(i< o1.size()){
           Object obj1 = o1.get(i);
           Object obj2 = o2.get(i);
            if (obj1 == null && obj2 != null) {
                return -1;
            }else if (obj1 != null && obj2 == null) {
                return 1;
            }else if(obj1 != null && obj2 != null){
                int value = compareTo(obj1.toString(), obj2.toString());
                if(value!=0){
                      return value;
                }
            }
            i++;
      }
      return 0;
   }
}

答案 2 :(得分:0)

String number= str.substring(Math.max(str.length() - 10, 0));
number ="0"+number;