我有两个数组:
private String[] placeName;
private Double[] miles;
其中的数据如下所示:
placeName = {"home", "away", "here"};
miles = {111, 11, 3};
值的位置相互匹配。主场= 111,客场= 11
我需要将这些数组排序在一起,这样我就不会丢失它们是如何由数字匹配的-从最低到最高。实现这一目标的最佳方式是什么?我需要先组合数组吗?
由于这两个值是如此紧密地耦合在一起,我实际上会编写一个自定义类来包含信息,然后对这些类进行排序,而不是摆弄原始数组。这样做会让你对许多可能的错误敞开大门。
这允许更好的控制,数据封装和将来扩展你的类可能包含的方法或数据。
public class MyDistance implements Comparable<MyDistance> {
private String placename;
private double mileage;
public MyDistance(String placename, double milage) {
this.placename = placename;
this.milage = milage;
}
public String getPlacename() {
return this.placename;
}
public double getMilage() {
return this.milage;
}
@Override
public int compareTo(MyDistance anotherDistance)
{
return milage.compareTo(anotherDistance.getMilage());
}
}
如果你想要更灵活的排序,而不是让你的MyDistance类实现Comparable,你可以写一个自定义的Comparator<MyDistance>
类:
public class DistanceComparator extends Comparator<MyDistance> {
@Override
public int compare(MyDistance dist1, MyDistance dist2) {
return dist1.getMilage().compareTo(dist2.getMilage());
}
}
你可以使用这个比较器来排序:
List<MyDistance> distanceList = getDistanceListSomehow();
Collections.sort(distanceList, new DistanceComparator());
您不限于列表,我只是为了说明目的而使用它。您应该查看所有的Java Collections类型,以选择最适合您的目的的类型。作为一个建议,ArrayList类型很容易使用,并且像你想要的那样保持顺序。
一种方法是创建一个TreeMap。假设您按英里排序。
TreeMap tm = new TreeMap<Double, String>();
for (int i=0; i<miles.length; i++) {
tm.put(miles[i], placeName[i]);
}
// tm is already sorted - iterate over it...
注意:如果你有相同的英里距离的地方,这个将不起作用。例如,如果你的"work"在11英里外,就像"away"一样,这是行不通的。你可能需要某种形式的MultiMap
可以将数组放到TreeMap中并进行排序
SortedMap<Double,String> map = new TreeMap<>();
map.put(111,"home");
map.put(11,"away");
map.put(3,"here");
插入的元素按键