列表:组重复并根据重复数量创建新列表

时间:2015-11-03 21:44:24

标签: java

对不起,我现在累得太累了(太长时间不睡觉),项目截止日期是1小时......

我有一个列表,例如:{aaa,aaa,bbb,ccc,aaa,bbb,ccc,bbb}。 我需要以这种方式准备myList:

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

根据重复数量将自己呈现为单独的列表: {AAA,BBB} {CCC}

这是我丑陋的代码:

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);

2 个答案:

答案 0 :(得分:0)

所有字谜都有相同的字符集。创建一个hashmap,将排序的chars列表作为键,将实际字符串列表作为值。然后最终将所有值组合到一个列表中。试着想一想如何做到这一点。如果你挣扎,我可以提供一些代码

将原始字符串数组传递给此函数

<强>代码

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);

现在结果会将所有字符串与字谜组合在一起。

答案 1 :(得分: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);