【问题标题】:Sorting an ArrayList<List> in Java [duplicate]在Java中对ArrayList<List>进行排序[重复]
【发布时间】:2017-02-09 01:23:29
【问题描述】:

我有一个ArrayList&lt;List&gt;,其中Lists 具有包含名称的字符串值,然后将双精度转换为字符串。

例子:

List<String> list = New List; 
list.add("Abraham");
list.add(String.valueOf(0.65));

List<String> list2 = New List; 
list2.add("Bowers");
list2.add(String.valueOf(0.89));

ArrayList<List> arrayList = new ArrayList<>();
arrayList.add(list); 
arrayList.add(list2); 

如何按双精度值降序排列ArrayList

【问题讨论】:

  • 您确定不想使用Map 吗?为什么将namevalue 存储在同一个列表中?
  • 列表将包含两个以上的项目,我想知道基于相关变量的名称顺序。
  • 你的描述(keyvalue 对)非常适合Map...查找HashMap

标签: java arraylist


【解决方案1】:

在自定义实现Comparator&lt;ArrayList&gt; 后使用Collections.sort(arrayList, instanceOfYourOwnImplemenationOfComparator)

或者更好的是,Java 是一种面向对象的语言,因此请创建一个专用于存储 String+double 的类并使其具有可比性。

class MyClass implements Comparable<MyClass> {
   private String word;
   private double score;

   MyClass(String word, double score) {
       this.word = word;
       this.score = score;
   }

   @Override
   public int compareTo(MyClass o) {
      return (int) Math.round(Math.signum(score - o.score));
   }

}

【讨论】:

  • 是的。固定的。谢谢
【解决方案2】:

我会更改您的实现并创建一个包含两个字段的类,一个 String 和一个 Double 字段。此类将实现 Comparable 接口,其 compareTo 将仅基于双精度。类似的东西

public class MyClass implements Comparable<MyClass> {
    private double value;
    private String name;

    /*Constructors, setters and getters*/

    public int compareTo(MyClass o) {
        return(new Double(value)).compareTo(myO.getValue));        
    }
}

那么,你的代码会变成:

ArrayList<List> arrayList = new ArrayList<>();
arrayList.add(new MyClass("abraham",0.65)); 
arrayList.add(new MyClass("bowers", 0.89)); 

Collections.sort(arrayList);

我刚刚输入了代码,但我相信这个想法很简单。

希望对你有帮助。

【讨论】:

    【解决方案3】:

    你应该使用一个类。我们就叫它Foo吧

    那么你会这样做

    List<Foo> mylist = new ArrayList<Foo>();
    mylist.add (new Foo("Abraham", 0.65);
    mylist.add (new Foo("Bowers", 0.89);
    // etc
    

    我将把它作为练习留给你编写 Foo 类。它应该实现 Comparable

    class Foo implements Comparable {
    // TODO
    

    终于

     Collections.sort(mylist);
    

    【讨论】:

      【解决方案4】:

      在 Java 8 中可以使用这样的流来完成

      arrayList.stream()
          .sorted((l1, l2) -> Doulbe.valueOf(l1.get(1)) - Doulbe.valueOf(l2.get(1)))
          .collect(Collectors.toList())
      

      这里 l1 和 l2 是您的子列表,它们的每个第二个元素都是您的数字。使用的比较器从另一个数字中减去一个数字,以决定您的子列表应按什么顺序输出arrayList

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-28
        • 2013-07-05
        • 1970-01-01
        • 2016-05-28
        • 2013-08-20
        • 2019-10-05
        • 2020-01-12
        相关资源
        最近更新 更多