我能够计算重复元素但不能有效地计算。基本上我有一个String类型的数组列表。例如:
ArrayList<String> s=new ArrayList<String>();
如果我使用foreach打印s,则输出为:
[1,2]
[1,4]
[4]
[3,5]
当有多个数组时,有效计算重复数字的方法是什么?任何形式的帮助都表示赞赏。
最终输出: 1是重复2次。 2是重复1次。 等等
答案 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}