首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >List<List<Object>>排序

List<List<Object>>排序
EN

Stack Overflow用户
提问于 2016-05-05 13:53:51
回答 3查看 1.3K关注 0票数 1

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

代码语言:javascript
复制
 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个位置的对象对进行排序。如果第0个位置的值等于或为空,则它将使用第二个position.etc处的对象进行排序。如果其中任何一个值为空,则该元素将被下移。但是,当我尝试使用我编写的代码进行排序时,它会得到排序,但既不是升序也不是降序。它只是被打乱了。

EN

回答 3

Stack Overflow用户

发布于 2016-05-05 13:57:18

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-05-05 14:06:05

尝尝这个,

代码语言:javascript
复制
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;
   }
}
票数 0
EN

Stack Overflow用户

发布于 2016-05-05 14:20:56

代码语言:javascript
复制
   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
        }

       });
   }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37043378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档