/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone{
public static <T extends Comparable<T>> void concurrentSort( final List<T> key, List<?>... lists){
// Do validation
if(key == null || lists == null)
for(List<?> list : lists)
if(list.size() != key.size())
// Lists are size 0 or 1, nothing to sort
if(key.size() < 2)
return;
// Create a List of indices
List<Integer> indices = new ArrayList<Integer>();
for(int i = 0; i < key.size(); i++)
indices.add(i);
// Sort the indices list based on the key
return key.get(i).compareTo(key.get(j));
}
});
Map
<Integer, Integer
> swapMap
= new HashMap
<Integer, Integer
>(indices.
size());
// create a mapping that allows sorting of the List by N swaps.
for(int i = 0; i < indices.size(); i++){
int k = indices.get(i);
while(swapMap.containsKey(k))
k = swapMap.get(k);
swapMap.put(i, k);
}
// for each list, swap elements to sort according to key list
for(Map.
Entry<Integer, Integer
> e
: swapMap.
entrySet()) for(List<?> list : lists)
}
///////////////////////////////////////////////
// Output
///////////////////////////////////////////////
List
<String
> list1
= Arrays.
asList("MURDER!",
"It's",
"Hello",
"Yes-Man",
"ON"); List
<String
> list2
= Arrays.
asList("demrru",
"ist",
"ehllo",
"aemnsy",
"no"); List
<Integer
> list3
= Arrays.
asList(2,
4,
3,
1,
5); List
<Double
> list4
= Arrays.
asList(0.2,
0.4,
0.3,
0.1,
0.5);
System.
out.
println("======= Before Sort ========");
System.
out.
println("======= Sort By List2 ========="); concurrentSort(list2, list1, list2, list3, list4);
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lewoJCglwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTxUPj4gdm9pZCBjb25jdXJyZW50U29ydCggZmluYWwgTGlzdDxUPiBrZXksIExpc3Q8Pz4uLi4gbGlzdHMpewogICAgICAgIC8vIERvIHZhbGlkYXRpb24KICAgICAgICBpZihrZXkgPT0gbnVsbCB8fCBsaXN0cyA9PSBudWxsKQogICAgICAgIAl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImtleSBjYW5ub3QgYmUgbnVsbC4iKTsKICAgICAgICAKICAgICAgICBmb3IoTGlzdDw/PiBsaXN0IDogbGlzdHMpCiAgICAgICAgCWlmKGxpc3Quc2l6ZSgpICE9IGtleS5zaXplKCkpCiAgICAgICAgCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbGwgbGlzdHMgbXVzdCBiZSB0aGUgc2FtZSBzaXplIik7CiAgICAgICAgCiAgICAgICAgLy8gTGlzdHMgYXJlIHNpemUgMCBvciAxLCBub3RoaW5nIHRvIHNvcnQKICAgICAgICBpZihrZXkuc2l6ZSgpIDwgMikKICAgICAgICAJcmV0dXJuOwogICAgICAgIAogICAgICAgIC8vIENyZWF0ZSBhIExpc3Qgb2YgaW5kaWNlcwoJCUxpc3Q8SW50ZWdlcj4gaW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKCQlmb3IoaW50IGkgPSAwOyBpIDwga2V5LnNpemUoKTsgaSsrKQoJCQlpbmRpY2VzLmFkZChpKTsKCiAgICAgICAgLy8gU29ydCB0aGUgaW5kaWNlcyBsaXN0IGJhc2VkIG9uIHRoZSBrZXkKCQlDb2xsZWN0aW9ucy5zb3J0KGluZGljZXMsIG5ldyBDb21wYXJhdG9yPEludGVnZXI+KCl7CgkJCUBPdmVycmlkZSBwdWJsaWMgaW50IGNvbXBhcmUoSW50ZWdlciBpLCBJbnRlZ2VyIGopIHsKCQkJCXJldHVybiBrZXkuZ2V0KGkpLmNvbXBhcmVUbyhrZXkuZ2V0KGopKTsKCQkJfQoJCX0pOwoJCQoJCU1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBzd2FwTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oaW5kaWNlcy5zaXplKCkpOwoKICAgICAgICAvLyBjcmVhdGUgYSBtYXBwaW5nIHRoYXQgYWxsb3dzIHNvcnRpbmcgb2YgdGhlIExpc3QgYnkgTiBzd2Fwcy4KCQlmb3IoaW50IGkgPSAwOyBpIDwgaW5kaWNlcy5zaXplKCk7IGkrKyl7CgkJCWludCBrID0gaW5kaWNlcy5nZXQoaSk7CgkJCXdoaWxlKHN3YXBNYXAuY29udGFpbnNLZXkoaykpCgkJCQlrID0gc3dhcE1hcC5nZXQoayk7CgkJCQoJCQlzd2FwTWFwLnB1dChpLCBrKTsKCQl9CgkJCiAgICAgICAgLy8gZm9yIGVhY2ggbGlzdCwgc3dhcCBlbGVtZW50cyB0byBzb3J0IGFjY29yZGluZyB0byBrZXkgbGlzdAogICAgICAgIGZvcihNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gZSA6IHN3YXBNYXAuZW50cnlTZXQoKSkKCQkJZm9yKExpc3Q8Pz4gbGlzdCA6IGxpc3RzKQoJCQkJQ29sbGVjdGlvbnMuc3dhcChsaXN0LCBlLmdldEtleSgpLCBlLmdldFZhbHVlKCkpOwoJfQoJCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJLy8gT3V0cHV0CgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257CgkJTGlzdDxTdHJpbmc+ICBsaXN0MSA9IEFycmF5cy5hc0xpc3QoIk1VUkRFUiEiLCJJdCdzIiwgIkhlbGxvIiwiWWVzLU1hbiIsICJPTiIpOwogICAgCUxpc3Q8U3RyaW5nPiAgbGlzdDIgPSBBcnJheXMuYXNMaXN0KCJkZW1ycnUiLCAiaXN0IiwgImVobGxvIiwgImFlbW5zeSIsICJubyIpOwogICAgCUxpc3Q8SW50ZWdlcj4gbGlzdDMgPSBBcnJheXMuYXNMaXN0KDIsIDQsIDMsIDEsIDUpOwogICAgCUxpc3Q8RG91YmxlPiAgbGlzdDQgPSBBcnJheXMuYXNMaXN0KDAuMiwgMC40LCAwLjMsIDAuMSwgMC41KTsKCQkKCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT0gQmVmb3JlIFNvcnQgPT09PT09PT0iKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdDEpOwoJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0Mik7CgkJU3lzdGVtLm91dC5wcmludGxuKGxpc3QzKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdDQpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigpOwoJCQoJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PSBTb3J0IEJ5IExpc3QyID09PT09PT09PSIpOwogICAgCWNvbmN1cnJlbnRTb3J0KGxpc3QyLCBsaXN0MSwgbGlzdDIsIGxpc3QzLCBsaXN0NCk7CgkJU3lzdGVtLm91dC5wcmludGxuKGxpc3QxKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdDIpOwoJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0Myk7CgkJU3lzdGVtLm91dC5wcmludGxuKGxpc3Q0KTsKCX0KfQ==
======= Before Sort ========
[MURDER!, It's, Hello, Yes-Man, ON]
[demrru, ist, ehllo, aemnsy, no]
[2, 4, 3, 1, 5]
[0.2, 0.4, 0.3, 0.1, 0.5]
======= Sort By List2 =========
[Yes-Man, MURDER!, Hello, It's, ON]
[aemnsy, demrru, ehllo, ist, no]
[1, 2, 3, 4, 5]
[0.1, 0.2, 0.3, 0.4, 0.5]