我有两个int数组
int[] sum=new int[n];
int[] newTime=new int[n];
Arrays.sort(sum);
我想要的是即使第二个数组使用相同的索引进行排序 的
我尝试过地图:
SortedMap<Integer, Integer> m = new TreeMap<Integer, Integer>();
for(int i = 0; i < priorities.length; i++){
m.put(sum[i],newTime[i]);
}
它只对第一个数组进行排序,第二个数组的索引不会改变。欢迎帮助! 谢谢!
答案 0 :(得分: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 :(得分:1)
你可以用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);
答案 2 :(得分: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]);
}
答案 3 :(得分: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));