【问题标题】:How to sort two arrays with respect to eachother.如何对两个数组进行相互排序。
【发布时间】:2014-07-22 20:22:17
【问题描述】:

我有 2 个数组:

private String[] placeName;
private Double[] miles;

其中的数据如下所示:

placeName = {"home", "away", "here"};
miles = {111, 11, 3};

值的位置相互匹配。即主场 = 111 客场 = 11

我需要将这些数组排序在一起,这样我就不会丢失它们是如何被数字匹配的——从最低到最高。实现这一目标的最佳方法是什么?我需要先合并数组吗?

【问题讨论】:

  • 通过使用一个类并为其实现一个比较器
  • 如果placeName 是唯一的,则使用TreeMap 填充placeName 作为keymiles 作为value
  • 你不能有1个二维数组并在一个字段上排序吗? stackoverflow.com/questions/4907683/…
  • @SajanChandran 我想他想按距离排序,而不是按地名。

标签: java arrays


【解决方案1】:

由于这两个值是如此紧密地耦合在一起,我实际上会编写一个自定义类来包含信息,然后对这些类进行排序,而不是使用原始数组。这样做会使您面临许多可能的错误。
这样可以更好地控制、数据封装和未来扩展您的类可能包含的方法或数据。

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

如果您希望排序更灵活,那么您可以编写自定义 Comparator&lt;MyDistance&gt; 类,而不是让 MyDistance 类实现 Comparable:

public class DistanceComparator extends Comparator<MyDistance> {
    @Override
    public int compare(MyDistance dist1, MyDistance dist2) {
        return dist1.getMilage().compareTo(dist2.getMilage());
    }
}

您可以使用此比较器通过 Collections 进行排序:

List<MyDistance> distanceList = getDistanceListSomehow();
Collections.sort(distanceList, new DistanceComparator());

您不仅限于列表,我只是将其用于解释目的。您应该查看Java Collections types 的全部范围,以最好地选择一个最适合您的目的。不过作为一个建议,ArrayList 类型易于使用,并且可以按照您的意愿保留顺序。

【讨论】:

  • 从技术上讲,这个MyDistance 类应该实现Comparable&lt;MyDistance&gt;,并将参数更改为compareTo()
【解决方案2】:

一种方法是创建 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...

注意:如果您有相同距离(以英里为单位)的地方,则此将不起作用。例如如果你有一个 11 英里的“工作”,就像“离开”一样,这是行不通的。您可能需要某种形式的 MultiMap 来实现这一点...

【讨论】:

  • 为什么要用里程作为钥匙?这似乎不必要地引入了问题。使用名称作为键,你只会得到同名的冲突
  • 因为他想按里程排序。
  • 不赞成票已被删除。我错过了他需要按里程排序的信息。
  • +1 用于指出重复键/距离可能导致数据丢失。当然需要提及。
  • 这个答案可能是最简单的,但我担心数据丢失的可能性,无论哪种方式都很好的解决方案可能对其他人有用+1
【解决方案3】:

也许将数组放在TreeMap 中并对其进行排序

SortedMap<Double,String> map = new TreeMap<>();
map.put(111,"home");
map.put(11,"away");
map.put(3,"here");

元素按其键排序插入

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2011-07-15
    • 2013-06-09
    • 1970-01-01
    • 2016-07-26
    相关资源
    最近更新 更多