【问题标题】:Sorting multiple arrays simultaneously同时对多个数组进行排序
【发布时间】:2014-11-10 21:29:18
【问题描述】:

所以我正在制作一个需要处理多个数组的程序。有没有办法对所有这些数组进行排序以反映一个数组的排序?这些值在所有三个数组中都位于相同的索引位置,并且需要在排序后保持相同的索引值

例子:

我有三个数组:

String[] distance = [1,3,6,7,9];
String[] name = [Joel, John, Joe, Jill, Jane]
String[] values = [1.5,2.3,5.6,7.1,6.5];

有没有办法对距离数组进行排序,然后将该排序反映到其他数组。所以如果我按名称排序,Jane 变成 0,那么其他数组中相同位置的其他值也会移动到 0。我该怎么做呢?

【问题讨论】:

  • 你不能用第四个数组来表示他们的位置吗?
  • 我该怎么做?
  • 基本上,您需要一个代理数组,它将索引保存到其他数组中。您可以根据需要对该数组进行排序
  • 我如何能够以任何有用的方式对代理数组进行排序,按字母顺序或从最大到最小的距离?然后将该排序应用于其余部分?
  • 推荐的方法是创建一个具有三个值的pojo 并维护 List 并实现一个 Comparator 并使用 Collections.sort

标签: java arrays sorting


【解决方案1】:

更好/更面向对象的方法可能是让一个对象保存 3 个字段中的每一个,并让它在您需要的任何字段上进行排序。

public static class MyObject implements Comparable<MyObject> {

    public int distance;
    public String name;
    public float value;


    // Replace this with whichever field is needed
    @Override
    public int compareTo(MyObject o) {
        // If it's the String
        return this.name.compareTo(o.name);
        // If it's one of the values
        return this.distance - o.distance;
    }
}

【讨论】:

    【解决方案2】:

    假设每个数组都有一个到另一个数组的索引映射,您将需要一个代理数组来维护该映射,然后对这个数组进行相应的排序,例如...

    映射数组充当主索引器,即使它自己的顺序可能发生变化,每个条目仍然指向它所代表的其他数组中的关联位置...

    String[] distance = {"1", "3", "6", "7", "9"};
    String[] name = {"Joel", "John", "Joe", "Jill", "Jane"};
    String[] values = {"1.5", "2.3", "5.6", "7.1", "6.5"};
    // Mapping array...
    Integer[] proxyLookup = new Integer[]{0, 1, 2, 3, 4};
    
    System.out.println("Unsorted...");
    
    for (int index : proxyLookup) {
        System.out.println(name[index] + "; " + distance[index] + "; " + values[index]);
    }
    
    Arrays.sort(proxyLookup, new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return name[o1].compareTo(name[o2]);
        }
    });
    
    System.out.println("Sorted...");
    
    for (int index : proxyLookup) {
        System.out.println(name[index] + "; " + distance[index] + "; " + values[index]);
    }
    

    这将输出...

    Unsorted...
    Joel; 1; 1.5
    John; 3; 2.3
    Joe; 6; 5.6
    Jill; 7; 7.1
    Jane; 9; 6.5
    
    Sorted...
    Jane; 9; 6.5
    Jill; 7; 7.1
    Joe; 6; 5.6
    Joel; 1; 1.5
    John; 3; 2.3
    

    请注意,列出的值的顺序不同,但关联的数据保持不变...

    一个更简单的解决方案是将数据封装到一个维护属性的Object 中。这将大大简化问题

    【讨论】:

      猜你喜欢
      • 2013-06-03
      • 2014-06-13
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多