【问题标题】:Sorting an ArrayList of arrays in java在java中对数组的ArrayList进行排序
【发布时间】:2017-05-24 10:46:57
【问题描述】:

我想知道您是否知道一种在 Java 中对数组的 ArrayList 进行排序的方法。 我有一个函数可以为特定数组提供 0 到 1 之间的分数。我想对 ArrayList 进行排序,以便得分最高的数组排在第一位。

public double evaluate(int[] toEvaluate) {
    double result = 0.0;
    for (int i = 0; i < toEvaluate.length; i++) {
        result += table[i][casesMap.get(toEvaluate[i])];
    }
    return result / toEvaluate.length;
}

有什么想法吗?

【问题讨论】:

  • Google 比较器。

标签: java arrays sorting arraylist


【解决方案1】:

您应该将Collections.sort() 与自定义Comparator 一起使用:

List<Integer[]> arrays = new ArrayList<>();

arrays.add(new Integer[]{1, 2});
arrays.add(new Integer[]{3, 4});

Collections.sort(arrays, new Comparator<Integer[]>() {
    public int compare(Integer[] a, Integer[] b) {
        return 1; // FIX this according to your needs
    }
});

上面的compare()只是一个stub,你应该根据documentation来实现它,它可以被替换为一个lambda表达式。在上面的代码中,这将是:Collections.sort(arrays, (a, b) -&gt; 1)

【讨论】:

    【解决方案2】:

    您必须编写一个 Comparator 和 compare 方法覆盖,您可以在其中使用您的函数来计算 comp 值

      @Override
                    public int compare(Integer[] o1, Integer[] o2) {
                     int o1Number=ratingFunction(o1) ;
                     int o2Number=ratingFunction(o2) ;  
                     int cmp=o1Number.compareTo(o2Number);
                        return cmp;
                    }
    

    【讨论】:

      【解决方案3】:

      您可以使用比较器对列表进行降序排序,也可以使用集合排序方法,然后使用反向方法使其降序, 像这样:

          List<Integer> numberList =new ArrayList<Integer>();
          numberList.add(3);
          numberList.add(1);
          numberList.add(2);
      
          //before sort
          for (Integer integer : numberList) {
              System.out.println(integer);
          }
      
          //sorting
          Collections.sort(numberList);
          Collections.reverse(numberList);
      
          //after sort
          for (Integer integer : numberList) {
              System.out.println(integer);
          }
      

      【讨论】:

        【解决方案4】:

        您可能想为此使用stream api。因此,假设我们有评分功能(为了举例,我对其进行了简化)。

        public static double evaluate(int[] arr){
             return Arrays.stream(arr).sum() / arr.length;
        }
        

        现在我们可以将它与Comparator.comparing 方法一起使用:

        List<int[]> list = Arrays.asList(new int[]{4, 5}, 
                                  new int[]{2, 3}, new int[]{0, 1});
        List<int[]> sorted = list.stream().
                sorted(Comparator.comparing(Main::evaluate)).
                collect(Collectors.toList());
        
        sorted.forEach(x -> System.out.println(Arrays.toString(x)));
        

        代码背后的想法很简单,您提供了一个比较器,它定义了如何对int[] 数组进行排序。我希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 2015-07-05
          • 2013-08-20
          • 1970-01-01
          • 2017-06-07
          • 1970-01-01
          • 2017-12-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多