2015-11-03 69 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);