基于Integer值在java中对两个List(String,Integer)进行排序

时间:2012-04-19 12:03:52

标签: java list

我正在开发一个程序,我正在读取文件并提取关键字及其计数。后来我需要选择最高频率的单词并将其与关键字匹配。

我已将我在文件中找到的所有关键字存储在字符串列表中。 我希望根据频率对这些进行排序。因此,如果在索引17处我有一个单词“stack”,其他整数列表中的索引17处的值最大,我希望将它们带到位置1.

我可以使用collections.sort对它们进行排序,但它不会处理其他列表。

这是我的代码:

while(m.find()) 
    {
        if(keyword.contains(m.group()))
            {
            keywordcount.set(keyword.indexOf(m.group()),keywordcount.get(keyword.indexOf(m.group()))+1);
            //System.out.println("*"+m.group()+":"+keywordcount.get(keyword.indexOf(m.group())));
            }
        else
            {
            keyword.add(m.group());
            int var=keyword.indexOf(m.group());
            //System.out.println(m.group()+":"+var);
            keywordcount.add(var, 1);
            }
        //System.out.println(keyword.size()+"#"+keywordcount.size());                       
    }
    for(int i=0;i<keyword.size();i++)
    {
        System.out.print(keyword.get(i)+ ":" +keywordcount.get(i)+" ");
    }

3 个答案:

答案 0 :(得分:5)

通常,人们会将StringInteger放入一个类中,并对该类的实例列表进行排序。

E.g。

class StringCount implements Comparable<StringCount> {
    private final String string;
    private final int count;

    public StringCount(String string, int count) {
        this.string = string;
        this.count = count;
    }

    @Override
    public int compareTo(StringCount right) {
        return this.count < right.count ? -1
             : this.count > right.count ? 1
             : 0;
    }

    // implement equals and hashCode too
    // if a.compareTo(b) == 0, then a.equals(b) should return true.

}

然后,您可以创建List<StringCount>并致电Collections.sort(stringCountList)

请注意,这会首先将StringCount个实例设为最低值,因此它们会按升序排列。

答案 1 :(得分:1)

final List<String> words = new ArrayList<>();
final Map<String, Integer> frequencies = new HashMap<>();

while (m.find())  {
    String word = ...extract the word from m...;

    if (!words.contains(word)) words.add(word);

    if (!frequencies.contains(word)) frequencies.put(word, 1);
    else frequencies.put(word, frequencies.get(word) + 1);
}

Collections.sort(words, new Comparator<String>() {
    @Override public int compare(String s1, String s2) {
        int f1 = frequencies.get(s1);
        int f2 = frequencies.get(s2);
        if (f1 < f2) return 1;
        if (f1 > f2) return -1;
        return 0;
    }
});

答案 2 :(得分:1)

这可能是检查multisets的理想时刻。

  

支持与顺序无关的相等性的集合,如Set,但可能包含重复的元素。 multiset有时也被称为包。

     

多个集合中彼此相等的元素称为相同单个元素的出现。多集中元素的出现总数称为该元素的计数(术语“频率”和“多重性”是等效的,但在此API中未使用)。由于元素的计数表示为int,因此多重集可能永远不会包含任何一个元素的Integer.MAX_VALUE次数。