只是想知道使用 Java 实现算法来计算每个字符串在字符串数组中存在的次数的最快方法是什么?
这是我尝试过的,它有效,但我担心它可能在"作弊",因为它有点偏离了这个问题:
{
String[] stringArray = {"Random", "Words", "Here","Random", "Words", "Here","Random", "Words", "Here","Random", "Words", "Here"};
List asList = Arrays.asList(stringArray);
Set<String> mySet = new HashSet<>(asList);
mySet.stream().forEach((s) -> {
System.out.println(s + " " +Collections.frequency(asList,s));
});
}
最简单的方法是使用Map#merge()
:
Map<String, Integer> m = new HashMap<>();
for (String s : array)
m.merge(s, 1, Integer::sum);
之后,m
将字符串保存为键,将出现项保存为值:
m.forEach((k, v) -> System.out.format("%s occured %s time(s)n", k, v));
通过在流中使用收集器:
Arrays.stream(list).collect(Collectors.groupingBy(e -> e, Collectors.counting()))
所以,如果你有这样的东西:
String[] list = new String[4];
list[0] = "something";
list[1] = "gfddfgdfg";
list[2] = "something";
list[3] = "somet444hing";
System.out.println(Arrays.stream(list).collect(Collectors.groupingBy(e -> e, Collectors.counting())));
输出将为:
{gfddfgdfg=1, something=2, somet444hing=1}
我会使用 groupingBy 返回计数映射。
Map<String, Long> counts = Stream.of(array)
.collect(Collectors.groupingBy(w -> w, Collectors.counting()));
要打印这些,您也可以这样做
Stream.of(array)
.collect(Collectors.groupingBy(w -> w, Collectors.counting()))
.forEach((k, v) -> System.out.println(k + " occurred " + v " times));