【问题标题】:List<List<Object>> sortingList<List<Object>> 排序
【发布时间】:2016-05-05 05:53:50
【问题描述】:

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

 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 个位置的值相等或为空,那么它将使用第 2 个位置的对象等进行排序。 如果其中任何一个值为空,则该元素将向下移动。 但是,当我尝试使用我编写的代码进行排序时,它会排序,但既不是升序也不是降序。它只是洗牌。

【问题讨论】:

  • 我不会把那个静态 i 放在比较器类中。那是不好的做法。在多线程环境中,您最终会遇到一些非常奇怪的行为。
  • 您想对列表进行相互排序吗?或者只是按升序或降序对特定列表进行独立排序??
  • 我想按升序对特定列表进行排序
  • 我也想对列表进行排序...所以 List> 中的元素内部列表不应该改变

标签: java arraylist comparator


【解决方案1】:

在这里使用递归是没有意义的。只需循环遍历两个Lists 以比较它们的元素。

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

【讨论】:

    【解决方案2】:

    试试这个,

    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;
       }
    }
    

    【讨论】:

    • 你用过while循环吗?
    • 如果 obj1 和 obj2 为空,那么它将检查每个对象中的下一个对象。
    【解决方案3】:
       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
            }
    
           });
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 2022-08-19
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多