列表<列表<Object>>排序



排序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个位置的Object等进行排序。如果其中任何一个值为空,则该元素将向下移动。然而,当我尝试使用我编写的代码进行排序时,它会进行排序,但既不按升序也不按降序。它只是被打乱了。

在这里使用递归毫无意义。只需在循环中对两个List进行迭代,即可比较它们的元素。

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

试试这个,

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;
   }
}
   public static void main(String args[]) {
       List<List<String>> list = new ArrayList<>();
       List<String> a = new ArrayList<>();
       a.add("c");
       a.add("a");
       List<String> b = new ArrayList<>();
       b.add("h");
       b.add("b");
       list.add(a);
       list.add(b);
       Collections.sort(list,new Comparator<List<String>>() {
        @Override
        public int compare(List<String> o1, List<String> o2) {
            Collections.sort(o1);
            Collections.sort(o2);
            //Compare your list based on your criteria
        }
       });
   }

最新更新