Java 使用重复字符串对ArrayList排序

Java 使用重复字符串对ArrayList排序,java,android,arraylist,charts,duplicates,Java,Android,Arraylist,Charts,Duplicates,我有一个数组列表,里面有一些字符串 我想得到每个字符串的重复数,并按从高到低的顺序排列,如下所示: ArrayList<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("b"); list.add("c"); list.add("a"); l

我有一个数组列表,里面有一些字符串 我想得到每个字符串的重复数,并按从高到低的顺序排列,如下所示:

ArrayList<String> list = new ArrayList<String>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("b");
    list.add("c");
    list.add("a");
    list.add("a");
    list.add("a");

    Set<String> uniqueSet = new HashSet<String>(list);
    for (String temp : uniqueSet) {

        System.out.println(temp + ": " + Collections.frequency(list, temp));
    }
ArrayList list=new ArrayList();
列表。添加(“a”);
列表。添加(“b”);
列表。添加(“c”);
列表。添加(“d”);
列表。添加(“b”);
列表。添加(“c”);
列表。添加(“a”);
列表。添加(“a”);
列表。添加(“a”);
Set uniqueSet=新哈希集(列表);
用于(字符串温度:uniqueSet){
System.out.println(temp+“:”+Collections.frequency(list,temp));
}
我想为一个制图项目存储前10个值,这样我不仅需要打印它们,还需要将结果放在某个地方,例如,当我调用“a”时,它给我3个值。

要将字符串映射到int(字母到频率),可以使用映射对象:

ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("b");
list.add("c");
list.add("a");
list.add("a");
list.add("a");
Collections.sort(list);
Map<String, Integer> map = new HashMap<String,Integer>();
for (String string : list) {
    if(!map.containsKey(string)){
        map.put(string, Collections.frequency(list, string));
    }
}
ArrayList list=new ArrayList();
列表。添加(“a”);
列表。添加(“b”);
列表。添加(“c”);
列表。添加(“d”);
列表。添加(“b”);
列表。添加(“c”);
列表。添加(“a”);
列表。添加(“a”);
列表。添加(“a”);
集合。排序(列表);
Map Map=newhashmap();
用于(字符串:列表){
如果(!map.containsKey(字符串)){
map.put(string,Collections.frequency(list,string));
}
}
然后地图包含了想要的信息

HashMap是一种方便的方式来存储具有唯一键的信息,并且每个键都有一个值。

番石榴非常适合,它像一个集合一样工作,但会记录元素的计数

Multiset<String> letters = ImmutableMultiset.of("a", "b", "d", "b", "a", "a", "a", "i", "f");
// [a x 4, b x 2, d, f, i]

letters.count("a"); 
// 4
Multiset letters=不可变的多组字母(“a”、“b”、“d”、“b”、“a”、“a”、“i”、“f”);
//[a x 4,b x 2,d,f,i]
字母。计数(“a”);
// 4
获得最高计数元素也不太难

Multiset<String> top3 = LinkedHashMultiset.create();
letters.entrySet().stream()
    .sorted((l1, l2) -> Integer.compare(l2.getCount(), l1.getCount()))
    .limit(3)
    .forEach(e -> top3.add(e.getElement(), e.getCount()));
// [a x 4, b x 2, d]
Multiset-top3=LinkedHashMultiset.create();
letters.entrySet().stream()
.sorted((l1,l2)->Integer.compare(l2.getCount(),l1.getCount())
.限额(3)
.forEach(e->top3.add(e.getElement(),e.getCount());
//[a x 4,b x 2,d]

正如你们中的一些人提到的OOP,我创建了一个包含2个变量和getter setter的模型类,我将“temp”放在name中,将“Collections.frequency(list,temp)”放在Fre中,然后我尝试列出一些对象,并用以下代码对它们进行排序:

   Collections.sort(jList, new Comparator<GetJournalsModel>() {
        @Override
        public int compare(GetJournalsModel a1, GetJournalsModel a2) {
            return a1.getFre() - a2.getFre();
        }
    });
Collections.sort(jList,newcomparator(){
@凌驾
公共int比较(GetJournalsModelA1、GetJournalsModelA2){
返回a1.getFre()-a2.getFre();
}
});

为什么要调用“a”给出“3”?一个更有用的数据结构是一个映射,您可以将计数和字符作为键。哦,我明白为什么了。但这和android有什么关系呢?@ItamarGreen正如我所写,我的图表项目是针对android应用程序的,现在我明白了,我正在使用MPchart Androidh。你在安卓平台上测试过我的答案吗?我自己已经有一段时间没有在android上开发了,所以我非常渴望这个XD。不要认为这里真的需要Collections.sort。Collections.sort只是确保键保持唯一性的另一种方法。但我同意,不太可能necessary@brso05在一个映射中增加一个值是非常麻烦和不方便的。我会的,但是这个问题特别需要一个arraylist。我不知道在程序的不同部分中是否需要一种方法,对于频率计数器来说,仅使用映射是一种简单且更常用的方法。而且它不依赖Collections.frequency(),这不是一个非常经济高效的实现。