有没有办法找到String
中最常见的ArrayList
?
ArrayList<String> list = new ArrayList<>();
list.add("test");
list.add("test");
list.add("hello");
list.add("test");
应从此列表["test","test","hello","test"]
答案 0 :(得分:15)
不要重新发明方向盘并使用frequency
类的Collections
方法:
public static int frequency(Collection<?> c, Object o)
返回指定集合中等于的元素数 指定的对象。更正式地说,返回元素的数量e 在集合中(o == null?e == null:o.equals(e))。
如果您需要计算所有元素的出现次数,请使用Map并巧妙地循环:)
或者使用上面的frequency
方法将列表放在Set的每个元素上。 HTH
EDIT / Java 8 :如果您喜欢使用lambdas的功能更强大的Java 8单行解决方案,请尝试:
Map<String, Long> occurrences =
list.stream().collect(Collectors.groupingBy(w -> w, Collectors.counting()));
答案 1 :(得分:9)
In statistics, this is called the "mode"。 vanilla Java 8解决方案如下所示:
Stream.of("test","test","hello","test")
.collect(Collectors.groupingBy(s -> s, Collectors.counting()))
.entrySet()
.stream()
.max(Comparator.comparing(Entry::getValue))
.ifPresent(System.out::println);
哪个收益率:
test=3
System.out.println(
Seq.of("test","test","hello","test")
.mode()
);
收率:
Optional[test]
(免责声明:我为jOOλ背后的公司工作)
答案 2 :(得分:5)
您可以制作HashMap<String,Integer>
。如果字符串已经出现在地图中,请将其键增加1,否则,将其添加到地图中。
例如:
put("someValue", 1);
然后,假设它&#34; someValue&#34;再一次,你可以这样做:
put("someValue", get("someValue") + 1);
由于&#34; someValue&#34;的键是1,现在当你把它放在键上时,键将是2。
之后,您可以轻松浏览地图并提取值的键。
我没有写一个完整的解决方案,如果你遇到问题就尝试构建一个解决方案。最佳做法是自学。
答案 3 :(得分:2)
我认为最好的方法是使用包含计数的地图。
Map<String, Integer> stringsCount = new HashMap<>();
迭代填充此地图的数组:
for(String s: list)
{
Integer c = stringsCount.get(s);
if(c == null) c = new Integer(0);
c++;
stringsCount.put(s,c);
}
最后,你可以在地图上迭代重复的元素:
Map.Entry<String,Integer> mostRepeated = null;
for(Map.Entry<String, Integer> e: stringsCount.entrySet())
{
if(mostRepeated == null || mostRepeated.getValue()<e.getValue())
mostRepeated = e;
}
显示最常见的字符串:
if(mostRepeated != null)
System.out.println("Most common string: " + mostRepeated.getKey());
答案 4 :(得分:2)
答案 5 :(得分:0)
您可以使用HashMap<String,Integer>
。循环遍历数组,您可以检查每个String
是否已经是HashMap
的密钥,添加它并将值设置为1,如果是,则将其值增加1。 / p>
然后你有一个HashMap
,其中包含所有唯一的String
以及一个相关的数字,表明它们在数组中的数量。
答案 6 :(得分:0)
如果有人需要从通常的String []数组中找到最受欢迎的(使用Lists):
public String findPopular (String[] array) {
List<String> list = Arrays.asList(array);
Map<String, Integer> stringsCount = new HashMap<String, Integer>();
for(String string: list)
{
if (string.length() > 0) {
string = string.toLowerCase();
Integer count = stringsCount.get(string);
if(count == null) count = new Integer(0);
count++;
stringsCount.put(string,count);
}
}
Map.Entry<String,Integer> mostRepeated = null;
for(Map.Entry<String, Integer> e: stringsCount.entrySet())
{
if(mostRepeated == null || mostRepeated.getValue()<e.getValue())
mostRepeated = e;
}
try {
return mostRepeated.getKey();
} catch (NullPointerException e) {
System.out.println("Cannot find most popular value at the List. Maybe all strings are empty");
return "";
}
}
答案 7 :(得分:0)
我知道这需要更多的时间来实现,但你可以通过在节点中存储count和字符串信息来使用堆数据结构
答案 8 :(得分:0)
您可以使用Guava的Multiset:
ArrayList<String> names = ...
// count names
HashMultiset<String> namesCounts = HashMultiset.create(names);
Set<Multiset.Entry<String>> namesAndCounts = namesCounts.entrySet();
// find one most common
Multiset.Entry<String> maxNameByCount = Collections.max(namesAndCounts, Comparator.comparing(Multiset.Entry::getCount));
// pick all with the same number of occurrences
List<String> mostCommonNames = new ArrayList<>();
for (Multiset.Entry<String> nameAndCount : namesAndCounts) {
if (nameAndCount.getCount() == maxNameByCount.getCount()) {
mostCommonNames.add(nameAndCount.getElement());
}
}
答案 9 :(得分:0)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class StringChecker {
public static void main(String[] args) {
ArrayList<String> string;
string = new ArrayList<>(Arrays.asList("Mah", "Bob", "mah", "bat", "MAh", "BOb"));
Map<String, Integer> wordMap = new HashMap<String, Integer>();
for (String st : string) {
String input = st.toUpperCase();
if (wordMap.get(input) != null) {
Integer count = wordMap.get(input) + 1;
wordMap.put(input, count);
} else {
wordMap.put(input, 1);
}
}
System.out.println(wordMap);
Object maxEntry = Collections.max(wordMap.entrySet(), Map.Entry.comparingByValue()).getKey();
System.out.println("maxEntry = " + maxEntry);
}
答案 10 :(得分:0)
使用此方法,如果ArrayList中有多个最常见的元素,则可以通过将它们添加到新的ArrayList来获取所有这些元素。
public static void main(String[] args) {
List <String> words = new ArrayList<>() ;
words.add("cat") ;
words.add("dog") ;
words.add("egg") ;
words.add("chair") ;
words.add("chair") ;
words.add("chair") ;
words.add("dog") ;
words.add("dog") ;
Map<String,Integer> count = new HashMap<>() ;
for (String word : words) { /* Counts the quantity of each
element */
if (! count.containsKey(word)) {
count.put(word, 1 ) ;
}
else {
int value = count.get(word) ;
value++ ;
count.put(word, value) ;
}
}
List <String> mostCommons = new ArrayList<>() ; /* Max elements */
for ( Map.Entry<String,Integer> e : count.entrySet() ) {
if (e.getValue() == Collections.max(count.values() )){
/* The max value of count */
mostCommons.add(e.getKey()) ;
}
}
System.out.println(mostCommons);
}
}
答案 11 :(得分:-1)
有许多答案暗示HashMaps。我真的不喜欢他们,因为无论如何你必须再次遍历它们。相反,我会对列表进行排序
Collections.sort(list);
然后遍历它。类似于
的东西String prev = null, mostCommon=null;
int num = 0, max = 0;
for (String str:list) {
if (str.equals(prev)) {
num++;
} else {
if (num>max) {
max = num;
mostCommon = str;
}
num = 1;
prev = str;
}
}
应该这样做。