依据第一个数组的索引对Java排序第二个数组

4

我有两个整型数组

int[] sum=new int[n];
int[] newTime=new int[n];
  1. 第一步: 1 5 3
  2. 第二步: 10 15 13

Arrays.sort(sum);

  1. 输出结果为 1 3 5

我想要的是第二个数组也按照相同的索引进行排序:

  1. 第一 => 第二: 10 13 15

我已经尝试使用maps:

SortedMap<Integer, Integer> m = new TreeMap<Integer, Integer>();
        for(int i = 0; i < priorities.length; i++){
            m.put(sum[i],newTime[i]);
        }

它只对第一个数组进行排序,第二个数组的索引不会改变。感谢您的帮助!


为什么不使用 Arrays.sort(newTime);?再说一遍,我不明白你想要实现什么。这个用例是什么? - Shubhendu Pramanik
1
@Eran 把它作为答案发布,这样我就可以检查它了! - user8569908
@ShubhenduPramanik 因为第一个数组可以是1、7、9,而第二个数组可以是20、11、3。 - user8569908
4个回答

2
例如,您可以使用Java-8这样做:
    int[] left = new int[] { 1, 5, 3 };
    int[] right = new int[] { 10, 15, 13 };

    IntStream.range(0, left.length)
            .boxed()
            .map(x -> new AbstractMap.SimpleEntry<>(left[x], right[x]))
            .sorted(Comparator.comparing(SimpleEntry::getKey))
            .forEach(System.out::println);

编辑

要获取第二个数组:

Integer[] second = IntStream.range(0, left.length)
            .boxed()
            .map(x -> new AbstractMap.SimpleEntry<>(left[x], right[x]))
            .sorted(Comparator.comparing(SimpleEntry::getKey))
            .map(SimpleEntry::getValue)
            .toArray(Integer[]::new);

我只有一个问题,现在怎么才能得到第二个数组呢?如果我使用String a = Arrays.toString(right); System.out.println(a); 这段代码会打印出第二个数组,但是它并没有排序。我该如何得到排序后的数组呢? - user8569908
太棒了!非常感谢,简单而快速。 - user8569908
先生,我有两个不同类型的ArrayList。 ArrayList<Double>是第一个ArrayList ArrayList<ProfileClass>是第二个ArrayList 在我的情况下是否可能做到这一点?我正在尝试,但DoubleStream上出现错误。 - Qaiser Hussain
1
@QaisarKhanBangash 发布一个单独的问题,这就是这个网站的用途。 - Eugene

1
你的 TreeMap 方法可以达到你所需的结果:
SortedMap<Integer, Integer> m = new TreeMap<Integer, Integer>();
for(int i = 0; i < priorities.length; i++){
    m.put(sum[i],newTime[i]);
}
// this will print the elements of the second array in the required order
for (Integer i : m.values()) {
    System.out.println (i);
}

当然,如果您想要的话,可以将元素重新分配回原始数组:
int count = 0;
for (Integer i : m.values()) {
    newTime[count] = i;
}
正如mlecz所评论的那样,这个解决方案仅在第一个数组(sum)没有重复项时才适用。

1
第一个数组中有重复项时,这是否正确? - mlecz
@mlecz 不,它不能处理第一个数组中的重复项。 - Eran
输入第一个数组:1 5 3 输入第二个数组:10 15 13 [1=10, 3=15, 5=13] 这是它打印出来的,我需要的是 1=10 3=13 5=15。 - user8569908
@E99 根据你问题中的代码,你调用了 put(1,10),put(5,15) 和 put(3,13),因此该映射表不可能包含 3=15 和 5=13。也许你的输入与你想象的不同。 - Eran
我先放第一个数组,然后再放第二个数组,这样首先我也可以放入 2 9 3 和第二个数组的20 50 90。输出应该是:2=20 3=90 9=50。这就是我想要实现的目标,根据第一个数组的索引对第二个数组进行排序。 - user8569908
@E99 我用数组 {2,9,3} 和 {20,50,90} 测试了代码。它打印出 20 90 50。如果我打印地图,我得到 {2=20, 3=90, 9=50},正如应该的那样。 - Eran

0
这是解决方案,适用于第一个数组中有重复项的情况。 您将两个数组的值保留在一起,使用一个数组中的索引进行排序,并从第二个数组的相应索引创建列表。
  static Integer[] sort(int[] arr1, int[] arr2) {
    assert arr1.length == arr2.length;
    class Tuple{
      int a1;
      int a2;
    }

    List<Tuple> tuples = new ArrayList<>();
    for(int i=0;i<arr1.length;i++){
      Tuple t = new Tuple();
      t.a1=arr1[i];
      t.a2=arr2[i];
      tuples.add(t);
    }
    tuples.sort((t1,t2)->Integer.compare(t1.a1,t2.a1));

    return (Integer[]) tuples.stream().map(t->t.a2).collect(Collectors.toList()).toArray(new Integer[arr1.length]);
  }

0
您可以同时对两个数组进行排序,按照第一个数组的重新排序方式进行操作,如下所示:
int[] sum = { 1, 5, 3 };
int[] newTime = { 10, 15, 13 };

for (int i = 0; i < sum.length; i++) {
    for (int j = 0; j < sum.length; j++) {
        if (sum[i] < sum[j]) {

            int temp = sum[i];
            int temp2 = newTime[i];

            sum[i] = sum[j];
            sum[j] = temp;

            newTime[i] = newTime[j];
            newTime[j] = temp2;
        }
    }
}

System.out.println(Arrays.toString(sum));
System.out.println(Arrays.toString(newTime));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接