import java.time.Month;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
class Main {
public static void main
(String[] args
) { var main = new Main();
// 各配列は、Comparableを継承している必要がある。
// Comparableを継承している型の配列であれば、なんでも扱える
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 newIndexs = makeNewIndexs(values);
}
private <T extends Comparable<T>> int[] makeNewIndexs(T[] values) {
var sortedList = IntStream.range(0, values.length)
.mapToObj(index -> new ValueWithIndex<T>(index, values[index]))
.sorted()
// .toList();
.collect(Collectors.toList());
var newIndexs = new int[sortedList.size()];
IntStream.range(0, sortedList.size())
.forEach(index -> newIndexs[sortedList.get(index).index] = index);
return newIndexs;
}
// 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);
// }
//
// }
/**
* ソート対象クラスです。
* @param <T> ソート対象の、Comparableを継承した型
*/
static class ValueWithIndex<T extends Comparable<T>> implements Comparable<ValueWithIndex<T>> {
final int index; // 元の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);
}
}
}
aW1wb3J0IGphdmEudGltZS5Nb250aDsKaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKCmNsYXNzIE1haW4gewoKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQl2YXIgbWFpbiA9IG5ldyBNYWluKCk7CgkJLy8g5ZCE6YWN5YiX44Gv44CBQ29tcGFyYWJsZeOCkue2meaJv+OBl+OBpuOBhOOCi+W/heimgeOBjOOBguOCi+OAggoJCS8vIENvbXBhcmFibGXjgpLntpnmib/jgZfjgabjgYTjgovlnovjga7phY3liJfjgafjgYLjgozjgbDjgIHjgarjgpPjgafjgoLmibHjgYjjgosKCQltYWluLnByaW50TmV3SW5kZXhzKG5ldyBJbnRlZ2VyW10geyAxLCAxMDAsIDEwLCAxMDAwMCwgMTAwMCB9KTsKCQltYWluLnByaW50TmV3SW5kZXhzKG5ldyBJbnRlZ2VyW10geyAzLCAxLCA0LCAxLCA1LCA5LCAyIH0pOwoJCW1haW4ucHJpbnROZXdJbmRleHMobmV3IEludGVnZXJbXSB7IDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEgfSk7CgkJbWFpbi5wcmludE5ld0luZGV4cyhuZXcgU3RyaW5nW10geyAiQSIsICJDIiwgIkIiLCAiRSIsICJEIiB9KTsKCQltYWluLnByaW50TmV3SW5kZXhzKG5ldyBNb250aFtdIHsgTW9udGguTUFSQ0gsIE1vbnRoLkpBTlVBUlksIE1vbnRoLkFQUklMLCBNb250aC5KQU5VQVJZLCBNb250aC5NQVksIE1vbnRoLlNFUFRFTUJFUiwgTW9udGguRkVCUlVBUlkgfSk7Cgl9CgkKCXByaXZhdGUgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPFQ+PiB2b2lkIHByaW50TmV3SW5kZXhzKFRbXSB2YWx1ZXMpIHsKCQl2YXIgbmV3SW5kZXhzID0gbWFrZU5ld0luZGV4cyh2YWx1ZXMpOwoJCVN5c3RlbS5vdXQucHJpbnRsbihBcnJheXMudG9TdHJpbmcobmV3SW5kZXhzKSk7Cgl9CgkKCXByaXZhdGUgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPFQ+PiBpbnRbXSBtYWtlTmV3SW5kZXhzKFRbXSB2YWx1ZXMpIHsKCQl2YXIgc29ydGVkTGlzdCA9IEludFN0cmVhbS5yYW5nZSgwLCB2YWx1ZXMubGVuZ3RoKQoJCQkJLm1hcFRvT2JqKGluZGV4IC0+IG5ldyBWYWx1ZVdpdGhJbmRleDxUPihpbmRleCwgdmFsdWVzW2luZGV4XSkpCgkJCQkuc29ydGVkKCkKLy8JCQkJLnRvTGlzdCgpOwoJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CgkJdmFyIG5ld0luZGV4cyA9IG5ldyBpbnRbc29ydGVkTGlzdC5zaXplKCldOwoJCUludFN0cmVhbS5yYW5nZSgwLCBzb3J0ZWRMaXN0LnNpemUoKSkKCQkuZm9yRWFjaChpbmRleCAtPiBuZXdJbmRleHNbc29ydGVkTGlzdC5nZXQoaW5kZXgpLmluZGV4XSA9IGluZGV4KTsKCQlyZXR1cm4gbmV3SW5kZXhzOwoJfQogICAgCi8vICAgIHN0YXRpYyByZWNvcmQgVmFsdWVXaXRoSW5kZXg8VCBleHRlbmRzIENvbXBhcmFibGU8VD4+KGludCBpbmRleCwgVCB2YWx1ZSkgaW1wbGVtZW50cyBDb21wYXJhYmxlPFZhbHVlV2l0aEluZGV4PFQ+PiB7Ci8vCi8vCQlAT3ZlcnJpZGUKLy8JCXB1YmxpYyBpbnQgY29tcGFyZVRvKFZhbHVlV2l0aEluZGV4PFQ+IG8pIHsKLy8JCQlyZXR1cm4gdmFsdWUuY29tcGFyZVRvKG8udmFsdWUpOwovLwkJfQovLyAgICAJCi8vICAgIH0KCS8qKgoJICog44K944O844OI5a++6LGh44Kv44Op44K544Gn44GZ44CCCgkgKiBAcGFyYW0gPFQ+IOOCveODvOODiOWvvuixoeOBruOAgUNvbXBhcmFibGXjgpLntpnmib/jgZfjgZ/lnosKCSAqLwoJc3RhdGljIGNsYXNzIFZhbHVlV2l0aEluZGV4PFQgZXh0ZW5kcyBDb21wYXJhYmxlPFQ+PiBpbXBsZW1lbnRzIENvbXBhcmFibGU8VmFsdWVXaXRoSW5kZXg8VD4+IHsKCQkKCQlmaW5hbCBpbnQgaW5kZXg7CS8vIOWFg+OBrmluZGV45oOF5aCx44GM5b+F6KaBCgkJZmluYWwgVCB2YWx1ZTsKCQlWYWx1ZVdpdGhJbmRleChpbnQgaW5kZXgsIFQgdmFsdWUpIHsKCQkJdGhpcy5pbmRleCA9IGluZGV4OwoJCQl0aGlzLnZhbHVlID0gdmFsdWU7CgkJfQoJCUBPdmVycmlkZQoJCXB1YmxpYyBpbnQgY29tcGFyZVRvKFZhbHVlV2l0aEluZGV4PFQ+IG8pIHsKCQkJcmV0dXJuIHZhbHVlLmNvbXBhcmVUbyhvLnZhbHVlKTsKCQl9CgkJCgl9CgkKfQo=
[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]