Files
Tom MOMMEJA ba1d8b29ca new file: README.md
new file:   Tri.java
2025-10-15 10:35:43 +02:00

84 lines
2.7 KiB
Java

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Comparator;
public class Tri {
public static void sort(Object array) {
if (array == null || !array.getClass().isArray()) {
throw new IllegalArgumentException("Un tableau est attendu.");
}
processArray(array);
}
// renvoie la somme (long) de tous les entiers contenus dans ce sous-arbre et effectue le tri en place
private static long processArray(Object arr) {
Class<?> cls = arr.getClass();
if (!cls.isArray()) throw new IllegalArgumentException("Array attendu");
Class<?> comp = cls.getComponentType();
// Feuille primitive int[]
if (comp.isPrimitive()) {
if (comp == int.class) {
int[] a = (int[]) arr;
Arrays.sort(a);
long s = 0;
for (int v : a) s += v;
return s;
} else {
throw new IllegalArgumentException("Type primitif non géré : " + comp);
}
}
// Feuille Integer[]
if (comp == Integer.class) {
Integer[] a = (Integer[]) arr;
Arrays.sort(a);
long s = 0;
for (Integer v : a) if (v != null) s += v;
return s;
}
// Sinon, éléments sont des sous-tableaux (ou éventuellement Number)
int n = Array.getLength(arr);
long[] sums = new long[n];
for (int i = 0; i < n; i++) {
Object child = Array.get(arr, i);
if (child == null) {
sums[i] = 0;
} else if (child.getClass().isArray()) {
sums[i] = processArray(child);
} else if (child instanceof Number) {
sums[i] = ((Number) child).longValue();
} else {
throw new IllegalArgumentException("Élément non géré : " + child.getClass());
}
}
// tri stable des éléments du tableau courant selon sums
Integer[] idx = new Integer[n];
for (int i = 0; i < n; i++) idx[i] = i;
Arrays.sort(idx, Comparator.comparingLong(i -> sums[i]));
Object sorted = Array.newInstance(comp, n);
for (int k = 0; k < n; k++) {
Array.set(sorted, k, Array.get(arr, idx[k]));
}
// recopie dans arr
for (int i = 0; i < n; i++) {
Array.set(arr, i, Array.get(sorted, i));
}
long total = 0;
for (long v : sums) total += v;
return total;
}
public static void main(String[] args) {
int[][] a = { {0,3,2}, {9,4,5}, {4,1,3} };
sort(a);
System.out.println(Arrays.deepToString(a));
}
}