import java.time.Month;
import java.util.Arrays;
import java.util.stream.IntStream;
class Main {
public static void main
(String[] args
) { var main = new Main();
main.
printNewIndexs(new Integer[] { 1,
100,
10,
10000,
1000 }); main.
printNewIndexs(new Integer[] { 3,
1,
4,
1,
5,
9,
2 }); main.
printNewIndexs(new Integer[] { 0,
1,
0,
1,
0,
1,
0,
1 }); main.
printNewIndexs(new String[] { "A",
"C",
"B",
"E",
"D" }); main.printNewIndexs(new Month[] { Month.MARCH, Month.JANUARY, Month.APRIL, Month.JANUARY, Month.MAY, Month.SEPTEMBER, Month.FEBRUARY });
}
private <T extends Comparable<T>> void printNewIndexs(T[] values) {
var originalIndexs = sortOriginalIndex(values);
var newIndexs = new int[originalIndexs.length];
IntStream.range(0, originalIndexs.length)
.forEach(index -> newIndexs[originalIndexs[index]] = index);
}
<T extends Comparable<T>> int[] sortOriginalIndex(T[] values) {
return IntStream.range(0, values.length)
.mapToObj(index -> new ValueWithIndex<T>(index, values[index]))
.sorted()
.mapToInt(valueWithIndex -> valueWithIndex.index)
.toArray();
}
// static record ValueWithIndex<T extends Comparable<T>>(int index, T value) implements Comparable<ValueWithIndex<T>> {
//
// @Override
// public int compareTo(ValueWithIndex<T> o) {
// return value.compareTo(o.value);
// }
//
// }
static class ValueWithIndex<T extends Comparable<T>> implements Comparable<ValueWithIndex<T>> {
final int index;
final T value;
ValueWithIndex(int index, T value) {
this.index = index;
this.value = value;
}
@Override
public int compareTo(ValueWithIndex<T> o) {
return value.compareTo(o.value);
}
}
}
aW1wb3J0IGphdmEudGltZS5Nb250aDsKaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKCmNsYXNzIE1haW4gewogICAgCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAJdmFyIG1haW4gPSBuZXcgTWFpbigpOwogICAgCW1haW4ucHJpbnROZXdJbmRleHMobmV3IEludGVnZXJbXSB7IDEsIDEwMCwgMTAsIDEwMDAwLCAxMDAwIH0pOwogICAgCW1haW4ucHJpbnROZXdJbmRleHMobmV3IEludGVnZXJbXSB7IDMsIDEsIDQsIDEsIDUsIDksIDIgfSk7CiAgICAJbWFpbi5wcmludE5ld0luZGV4cyhuZXcgSW50ZWdlcltdIHsgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSB9KTsKICAgIAltYWluLnByaW50TmV3SW5kZXhzKG5ldyBTdHJpbmdbXSB7ICJBIiwiQyIsIkIiLCJFIiwiRCIgfSk7CiAgICAJbWFpbi5wcmludE5ld0luZGV4cyhuZXcgTW9udGhbXSB7IE1vbnRoLk1BUkNILCBNb250aC5KQU5VQVJZLCBNb250aC5BUFJJTCwgTW9udGguSkFOVUFSWSwgTW9udGguTUFZLCBNb250aC5TRVBURU1CRVIsIE1vbnRoLkZFQlJVQVJZIH0pOwogICAgfQogICAgCiAgICBwcml2YXRlIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTxUPj4gdm9pZCBwcmludE5ld0luZGV4cyhUW10gdmFsdWVzKSB7CiAgICAJdmFyIG9yaWdpbmFsSW5kZXhzID0gc29ydE9yaWdpbmFsSW5kZXgodmFsdWVzKTsKICAgIAl2YXIgbmV3SW5kZXhzID0gbmV3IGludFtvcmlnaW5hbEluZGV4cy5sZW5ndGhdOwogICAgCUludFN0cmVhbS5yYW5nZSgwLCBvcmlnaW5hbEluZGV4cy5sZW5ndGgpCiAgICAJLmZvckVhY2goaW5kZXggLT4gbmV3SW5kZXhzW29yaWdpbmFsSW5kZXhzW2luZGV4XV0gPSBpbmRleCk7CiAgICAJU3lzdGVtLm91dC5wcmludGxuKEFycmF5cy50b1N0cmluZyhuZXdJbmRleHMpKTsKICAgIH0KICAgIAoJPFQgZXh0ZW5kcyBDb21wYXJhYmxlPFQ+PiBpbnRbXSBzb3J0T3JpZ2luYWxJbmRleChUW10gdmFsdWVzKSB7CiAgICAJcmV0dXJuIEludFN0cmVhbS5yYW5nZSgwLCB2YWx1ZXMubGVuZ3RoKQogICAgCQkJLm1hcFRvT2JqKGluZGV4IC0+IG5ldyBWYWx1ZVdpdGhJbmRleDxUPihpbmRleCwgdmFsdWVzW2luZGV4XSkpCiAgICAJCQkuc29ydGVkKCkKICAgIAkJCS5tYXBUb0ludCh2YWx1ZVdpdGhJbmRleCAtPiB2YWx1ZVdpdGhJbmRleC5pbmRleCkKICAgIAkJCS50b0FycmF5KCk7Cgl9CiAgICAKLy8gICAgc3RhdGljIHJlY29yZCBWYWx1ZVdpdGhJbmRleDxUIGV4dGVuZHMgQ29tcGFyYWJsZTxUPj4oaW50IGluZGV4LCBUIHZhbHVlKSBpbXBsZW1lbnRzIENvbXBhcmFibGU8VmFsdWVXaXRoSW5kZXg8VD4+IHsKLy8KLy8JCUBPdmVycmlkZQovLwkJcHVibGljIGludCBjb21wYXJlVG8oVmFsdWVXaXRoSW5kZXg8VD4gbykgewovLwkJCXJldHVybiB2YWx1ZS5jb21wYXJlVG8oby52YWx1ZSk7Ci8vCQl9Ci8vICAgIAkKLy8gICAgfQogICAgc3RhdGljIGNsYXNzIFZhbHVlV2l0aEluZGV4PFQgZXh0ZW5kcyBDb21wYXJhYmxlPFQ+PiBpbXBsZW1lbnRzIENvbXBhcmFibGU8VmFsdWVXaXRoSW5kZXg8VD4+IHsKICAgIAkKICAgIAlmaW5hbCBpbnQgaW5kZXg7CiAgICAJZmluYWwgVCB2YWx1ZTsKICAgIAlWYWx1ZVdpdGhJbmRleChpbnQgaW5kZXgsIFQgdmFsdWUpIHsKICAgIAkJdGhpcy5pbmRleCA9IGluZGV4OwogICAgCQl0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAJfQoJCUBPdmVycmlkZQoJCXB1YmxpYyBpbnQgY29tcGFyZVRvKFZhbHVlV2l0aEluZGV4PFQ+IG8pIHsKCQkJcmV0dXJuIHZhbHVlLmNvbXBhcmVUbyhvLnZhbHVlKTsKCQl9CiAgICAJCiAgICB9Cgp9Cg==
[0, 2, 1, 4, 3]
[3, 0, 4, 1, 5, 6, 2]
[0, 4, 1, 5, 2, 6, 3, 7]
[0, 2, 1, 4, 3]
[3, 0, 4, 1, 5, 6, 2]