【问题标题】:Ordering an ArrayList with duplicate Strings使用重复字符串对 ArrayList 进行排序
【发布时间】:2017-02-23 03:41:24
【问题描述】:

我有一个 ArrayList,里面有一些字符串 我想获取每个字符串的重复数,并将它们从最高数排序到最低数,如下所示:

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

我想存储 Charting 项目的前 10 个值,因此我不仅需要打印它们,还需要将结果放在某个地方,即例如,当我调用“a”时,它给了我 3。

【问题讨论】:

  • 为什么叫“a”会得到“3”?
  • 一个更有用的数据结构是一个映射,您可以在其中将计数与字符一起作为键。
  • 哦,我明白了。但它和安卓有什么关系?
  • @ItamarGreen 正如我所写,我的图表项目是针对一个 android 应用程序,我正在使用 MPchart android
  • 哦,现在我明白了。你在安卓平台上测试过我的答案吗?我自己也有一段时间没有在android上开发了,所以我很渴望这个XD。

标签: java android arraylist charts duplicates


【解决方案1】:

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

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

然后地图包含想要的信息。

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

【讨论】:

  • 不要认为 Collections.sort 在这里真的是必需的。
  • collections.sort 只是另一种确保键保持唯一性的方法。但我同意,不是很有必要
  • @brso05 在地图中增加一个值非常麻烦且非常不方便。
  • 我会的,但是这个问题特别要求一个数组列表。我不知道程序不同部分的方法是否需要它
  • 只使用地图是一种简单且更常用的频率计数器方法。此外,它不依赖 Collections.frequency(),这不是一个非常经济有效的实现。
【解决方案2】:

番石榴Multiset 会很合适,它的工作原理类似于 Set,但会记录元素的数量。

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<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]

【讨论】:

    【解决方案3】:

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

       Collections.sort(jList, new Comparator<GetJournalsModel>() {
            @Override
            public int compare(GetJournalsModel a1, GetJournalsModel a2) {
                return a1.getFre() - a2.getFre();
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2014-02-09
      • 2011-08-14
      • 1970-01-01
      • 2015-07-14
      • 2021-10-01
      • 1970-01-01
      • 2011-07-28
      • 2014-12-07
      • 1970-01-01
      相关资源
      最近更新 更多