2015-11-03 53 views
0

對不起,我太累了,搞清楚現在(太長時間沒有睡眠),以及項目的截止日期是在1個小時......列表:組重複,使acc.to副本的一些新的名單

我有一個列表,即像這樣:{aaa,aaa,bbb,ccc,aaa,bbb,ccc,bbb}。 我需要準備myList中以這種方式定義: {AAA,BBB} {CCC}

這是我的醜陋的代碼:

List<List<String>> myList = new ArrayList<List<String>>(); 

根據重複的數目目前本身像單獨的列表

int maxAnagramsNumber = 0; 
Set<String> unique = new HashSet<String>(anagramLineList); 

for (String key : unique) { //set max number of anagrams 
    if (maxAnagramsNumber < Collections.frequency(anagramLineList, key)){ 
     maxAnagramsNumber = Collections.frequency(anagramLineList, key); 
    } 
} 


int countedAnagrams = 0; 

for (int i=maxAnagramsNumber; i > 1; i--){ // group and make new list items acc.to number of duplicates 

    for (String anagramUnit : unique){ 

     if(countedAnagrams != i && countedAnagrams != 0){ 
      anagramLineListSorted.add(anagramUnit); 
     } 
     countedAnagrams = i; 
    } 
    myList.add(anagramLineListSorted); 
+1

你有什麼問題嗎? – resueman

+0

假設myList輸出如下所示:{ccc,ccc} {ccc,ccc} {ccc,ccc} ...我不知道如何將正確的列表 – mallorn

+0

分開得更精確:anagramLineList看起來像這樣: [安第斯山脈,安第斯山脈,安第斯山脈,丹麥人,丹麥人,丹麥人,院長,院長,院長,邪惡,邪惡,邪惡,加爾,加爾斯,滯後,滯後,萊維,列維,列維,列維,生活,生活,生活,生活,轎車,轎車,轎車,爐渣,礦渣,街道,測試人員,面紗,面紗,面紗,面紗,邪惡,邪惡,邪惡,邪惡] ...我不知道如何分開正確的名單有此MYLIST: [惡,李維斯,住,面紗,卑鄙] [安第斯山脈,丹麥人,院長,轎車] [加侖,滯後,渣] [街道,測試人員] [起義] 反正我看到anagramLineList有錯誤... – mallorn

回答

0

所有anagrams將具有相同的一組字符。創建一個哈希表,其中有字符的排序列表作爲鍵和實際字符串的列表作爲值。然後最後將所有值合併到一個列表中。試着去思考如何做到這一點。我可以提供一些代碼,如果你努力

通過你的原始字符串數組這個功能

代碼

public List<String> anagrams(String[] strs) { 
    ArrayList<String> result = new ArrayList<String>(); 
    if(strs == null || strs.length == 0) 
     return result; 

    HashMap<String, ArrayList<Integer>> map = new HashMap<String, ArrayList<Integer>>(); 
    for(int i=0; i<strs.length; i++){ 
     char[] arr = strs[i].toCharArray(); 
     Arrays.sort(arr); 
     String t = String.valueOf(arr); 
     if(map.get(t) == null){ 
      ArrayList<Integer> l = new ArrayList<Integer>(); 
      l.add(i); 
      map.put(t, l); 
     }else{ 
      map.get(t).add(i); 
     } 
    } 

    for(ArrayList<Integer> l: map.values()){ 
     if(l.size() > 1){ 
      for(Integer i: l){ 
       result.add(strs[i]); 
      } 
     } 
    } 

    return result; 
} 

如果你需要的是將列表

ArrayList<String> result = new ArrayList<String>(); 

for(ArrayList<String> l : combined) 
    for(String g : l) 
     result.add(g); 

現在結果將會把你所有的字符串與anagrams分組在一起。

+0

我已經準備好了我的anagrams列表。我需要劃分它:( – mallorn

+0

爲什麼不只是遍歷你的組合列表,並不斷添加組件到一個新的列表。這樣你就會有所有的元素順序 – AbtPst

+1

聽起來不錯,稍後會做... – mallorn

0

我還沒有編譯它(可能有一些語法問題)。但邏輯應該像你期望的那樣工作。

int maxAnagramsNumber = 0; 
Set<String> unique = new HashSet<String>(anagramLineList); 

Map<String, List<String>> ananas = new Map<String, List<Strin>>(); 

for (String ana:unique) { 

    char[] chars = theWord.toCharArray(); 
    Arrays.sort(chars); 
    String key = new String(chars); 


    List<String> llist = ananas.get(key) 
    if (llist == null) { 
     llist = new List<String>() 
     ananas.put(key, llist) 
    } 
    llist.add(ana) 
    } 

    println(ananas);