如何通過僅對單個數組進行排序來對三個數組進行排序?
int arr[]={20,10,5,22};
int arr2[]={120,344,43,122};
int arr3[]={2234,12,23,3434};
我想要的是對第一個數組 arr 進行排序,其餘數組必鬚根據第一個數組的索引進行排序。
output:
5 10 20 22
如上所示,arr
之前 5 的排序索引為 3,現在為 0。類似地,43 和 12 的索引應更改為 0
排序後的預期數組將是
5 10 20 22
43 344 120 122
23 12 2234 3424
當我們在冒泡排序或任何其他交換中交換元素時我想要什麼,我們通過交換更改為元素索引。我想要類似於其他兩個數組。
swap(arr[0],arr[2])
swap(arr1[0],arr1[2])
swap(arr2[0],arr2[2])
如果我實現自定義排序但想要一些可以減少代碼的東西,這是可能的。
這就是你如何做到這一點。這只是一個例子,性能可能很低。
選項 1.Lambda
public static void main(String... args) {
int[] arr = { 20, 10, 5, 22 };
int[] arr2 = { 120, 344, 43, 122 };
int[] arr3 = { 2234, 12, 23, 3434 };
sort(arr2, arr);
sort(arr3, arr);
Arrays.sort(arr);
}
private static void sort(int[] arr, int[] indices) {
final class Pair {
private final int index;
private final int value;
public Pair(int index, int value) {
this.index = index;
this.value = value;
}
}
AtomicInteger pos = new AtomicInteger(0);
IntStream.range(0, arr.length)
.mapToObj(i -> new Pair(indices[i], arr[i]))
.sorted(Comparator.comparingInt(one -> one.index))
.map(pair -> pair.value)
.forEach(value -> arr[pos.getAndIncrement()] = value);
}
選項 2. PriorityQueue
private static void sort(int[] arr, int[] indices) {
final class Pair {
private final int index;
private final int value;
public Pair(int index, int value) {
this.index = index;
this.value = value;
}
}
Queue<Pair> queue = new PriorityQueue<>(Comparator.comparingInt(one -> one.index));
for (int i = 0; i < arr.length; i++)
queue.add(new Pair(indices[i], arr[i]));
int i = 0;
while (!queue.isEmpty())
arr[i++] = queue.remove().value;
}
選項 3. 樹形圖
private static void sort(int[] arr, int[] indices) {
Map<Integer, List<Integer>> map = new TreeMap<>();
for (int i = 0; i < arr.length; i++) {
if (!map.containsKey(indices[i]))
map.put(indices[i], new ArrayList<>());
map.get(indices[i]).add(arr[i]);
}
int i = 0;
for (List<Integer> values : map.values())
for (int value : values)
arr[i++] = value;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句