Classificação sincronizada entre duas ArrayLists

Eu tenho duas ArrayLists.

  • O primeiro contém um grupo de palavras com letras maiúsculas e pontuação.

  • O outro contém esse mesmo grupo de palavras, mas com a capitalização e a pontuação removidas.

.

ArrayList1 ..... ArrayList2 MURDER! ........ murder It's ........... its Hello .......... hello Yes-Man ........ yesman ON ............. on 

A segunda matriz tem todas as palavras em ordem alfabética e todas as letras em cada palavra em ordem alfabética. Parece algo como isto:

 aemnsy demrru ehllo ist no 

Eu quero fazer com que quando eu organizar as palavras em ArrayList duas em ordem alfabética, todas as palavras de ArrayList um siga suite:

 ArrayList1 ..... ArrayList2 Yes-Man ........ aemnsy MURDER! ........ demrru Hello .......... ehllo It's ........... ist ON ............. no 

Eu tentei fazer um loop com uma declaração ou duas, mas acabou não funcionando e ficou muito longo. Como eu faço isso? Como faço isso de forma eficiente?

Aqui está uma function para classificar várias listas com base em uma única lista de ‘chaves’. As listas não precisam ser do mesmo tipo, aqui a lista de chaves é do tipo String e é usada para classificar uma lista String , Integer e Double ( Exemplo Ideone ):

 List key = Arrays.asList("demrru", "ist", "ehllo", "aemnsy", "no"); List list1 = Arrays.asList("MURDER!","It's", "Hello","Yes-Man", "ON"); List list2 = Arrays.asList(2, 4, 3, 1, 5); // Also use Integer type List list3 = Arrays.asList(0.2, 0.4, 0.3, 0.1, 0.5); // or Double type // Sort all lists (excluding the key) keySort(key, list1, list2, list3); // Sort all lists (including the key) keySort(key, key, list1, list2, list3); 

Saída:

 // Sorted by key: [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] 

Função de sorting

Um Exemplo Ideone pode ser encontrado aqui, o qual inclui a validação de parâmetros e um caso de teste.

 public static > void keySort( final List key, List... lists){ // Create a List of indices List indices = new ArrayList(); for(int i = 0; i < key.size(); i++) indices.add(i); // Sort the indices list based on the key Collections.sort(indices, new Comparator(){ @Override public int compare(Integer i, Integer j) { return key.get(i).compareTo(key.get(j)); } }); // Create a mapping that allows sorting of the List by N swaps. Map swapMap = new HashMap(indices.size()); // Only swaps can be used b/c we cannot create a new List of type  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 e : swapMap.entrySet()) for(List list : lists) Collections.swap(list, e.getKey(), e.getValue()); } 

First Way – Eu uso o mapa cuja chave é de arrayList2 e o valor é de arrayList1. Colocar dados para mapear é com você. Depois de ordenar arrayList2, recebo seu valor do mapa.

  List arrList1 = new ArrayList(); arrList1.add("MURDER!"); arrList1.add("It's"); arrList1.add("Hello"); arrList1.add("Yes-Man"); arrList1.add("ON"); List arrList2 = new ArrayList(); arrList2.add("demrru"); arrList2.add("aemnsy"); arrList2.add("ist"); arrList2.add("ehllo"); arrList2.add("no"); Map map1 = new HashMap(); map1.put("aemnsy", "Yes-Man"); map1.put("demrru", "MURDER!"); map1.put("ehllo", "Hello"); map1.put("ist", "It's"); map1.put("no", "ON"); Collections.sort(arrList2); for (String s : arrList2){ System.out.println(s + "..........." + map1.get(s)); } 

Second Way – Outra maneira é que você pode usar apenas o TreeMap que já está classificado em vez de dois ArrayList.

 Map map2 = new TreeMap(); map2.put("ehllo", "Hello"); map2.put("aemnsy", "Yes-Man"); map2.put("demrru", "MURDER!"); map2.put("no", "ON"); map2.put("ist", "It's"); for (Map.Entry entry : map2.entrySet()) { System.out.println(entry.getKey() + "/" + entry.getValue()); } 

Terceira maneira – usando apenas 2 ArrayList, mas temos que escrever o método de sorting por conta própria. Você notou que seus 2 elementos ArrayList, como aemnsy de arrayList2 e Yes-Man de arrayList1, têm o mesmo índice? Eu uso esse ponto.

  selectionSort1(arrList2, arrList1); for(int i = 0; i < arrList1.size(); i++){ System.out.println(arrList2.get(i) + "---" + arrList1.get(i)); } public static void selectionSort1(List x, List y) { for (int i=0; i 0) { //... Exchange elements in first array String temp = x.get(i); x.set(i, x.get(j)); x.set(j, temp); //... Exchange elements in second array temp = y.get(i); y.set(i, y.get(j)); y.set(j, temp); } } } } 

Uma resposta rápida.

 public class MapAlph { public static void main(String[] args) { HashMap map = new HashMap(); String txt = "Murde!r!"; ArrayList alph = new ArrayList(); for (int i = 0; i < txt.length(); i++) if (Character.isLetter(txt.charAt(i))) alph.add(txt.charAt(i)); Collections.sort(alph); Collections.reverse(alph); String val = ""; for (Character c : alph) val += c; map.put(txt, val); System.out.print(txt + " ........ " + map.get(txt)); } } 

Você pode fazer uso do TreeMap , se desejar.

 Map sortedMap = new TreeMap(); sortedMap.put("demrru", "MURDER!"); sortedMap.put("ist", "It's"); sortedMap.put("aemnsy", "Yes-Man"); sortedMap.put("ehllo", "Hello"); sortedMap.put("no", "ON"); 

Você pode tentar isto:

 import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class SortService { public static void main(String[] args) { Map originalMap = new HashMap(); originalMap.put("aemnsy", "Yes-Man"); originalMap.put("demrru", "MURDER!"); originalMap.put("ehllo", "Hello"); originalMap.put("ist", "It's"); originalMap.put("no", "ON"); Map sortedMap = new TreeMap(originalMap); System.out.println(sortedMap); } } 

saída:

 {aemnsy=Yes-Man, demrru=MURDER!, ehllo=Hello, ist=It's, no=ON}