我有一个ArrayList<List>
,其中List
具有保存名称的字符串值,然后将双精度转换为字符串。
的例子:
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
?
在自定义实现Comparator<ArrayList>
之后使用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));
}
}
我会改变你的实现并创建一个包含两个字段的类,一个String和一个Double。这个类将实现Comparable接口,并且它的compareTo将仅基于double类型。就像
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);
我只是输入了代码,但我相信这个想法是相当简单的。
您应该使用类。命名为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);
在Java 8中,它可以用这样的流来完成
arrayList.stream()
.sorted((l1, l2) -> Doulbe.valueOf(l1.get(1)) - Doulbe.valueOf(l2.get(1)))
.collect(Collectors.toList())
这里l1和l2是你的子列表,它们的第二个元素是你的数字。所使用的比较器从另一个数字中减去一个数字,以决定子列表应该以什么顺序放入输出arrayList