如何计算数组中重复元素的重复次数?

时间:2015-12-03 10:55:08

标签: java arrays list arraylist collections

我能够计算重复元素但不能有效地计算。基本上我有一个String类型的数组列表。例如:

ArrayList<String> s=new ArrayList<String>();

如果我使用foreach打印s,则输出为:

[1,2]
[1,4]
[4]
[3,5]

当有多个数组时,有效计算重复数字的方法是什么?任何形式的帮助都表示赞赏。

最终输出: 1是重复2次。 2是重复1次。 等等

2 个答案:

答案 0 :(得分:2)

如果您愿意使用第三方库,则可以使用支持原始包的GS Collections。 Bag是一种数据结构,用于跟踪每个唯一元素的出现。使用IntBag可以减少您的用例所需的装箱数量。

if (!BsonClassMap.IsClassMapRegistered(typeof(Order)))
        {
            BsonClassMap.RegisterClassMap<Order>(cm =>
                {
                    //do some stuff with property serialization
                });


}

如果您需要按值排序的输出,则可以使用CharAdapter remove = CharAdapter.adapt("[]"); IntBag counts = Lists.mutable.with("[1,2]", "[1,4]", "[4]", "[3,5]") .asLazy() .collectWith(StringIterate::rejectChar, remove::contains) .flatCollect(StringIterate::csvTokensToList) .collectInt(Integer::parseInt) .toBag(); Assert.assertEquals(2, counts.occurrencesOf(1)); Assert.assertEquals(1, counts.occurrencesOf(2)); 代替。但请注意,这将导致将整数加入整数。

SortedBag<Integer>

输出:

CharAdapter remove = CharAdapter.adapt("[]");
SortedBag<Integer> counts =
    Lists.mutable.with("[1,2]", "[1,4]", "[4]", "[3,5]")
        .asLazy()
        .collectWith(StringIterate::rejectChar, remove::contains)
        .flatCollect(StringIterate::csvTokensToList)
        .collect(Integer::parseInt)
        .toSortedBag();
Assert.assertEquals(2, counts.occurrencesOf(1));
Assert.assertEquals(1, counts.occurrencesOf(2));
System.out.println(counts.toStringOfItemToCount());

注意:我是GS Collections的开发人员

答案 1 :(得分:1)

您可以使用a counting collector

public static void main(String[] args) {
  List<String> s = Arrays.asList("[1,2]", "[1,4]", "[4]", "[3,5]");
  Map<Integer, Long> occurences = s.stream()
                  .flatMap(abc::parseString)
                  .collect(groupingBy(i -> i, counting()));
  System.out.println("occurences = " + occurences);
}

private static Stream<Integer> parseString(String s) {
  String[] numbers = s.substring(1, s.length() - 1).split(",");
  return Arrays.stream(numbers).map(Integer::parseInt);
}

输出:

  

出现= {1 = 2,2 = 1,3 = 1,4 = 2,5 = 1}