在ArrayList()中找到最常见的String

时间:2014-04-10 13:42:42

标签: java arrays list arraylist

有没有办法找到String中最常见的ArrayList

ArrayList<String> list = new ArrayList<>();
list.add("test");
list.add("test");
list.add("hello");
list.add("test");

应从此列表["test","test","hello","test"]

中找到“test”一词

12 个答案:

答案 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

jOOλ是一个支持流上mode()的库。以下程序:

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)

根据问题,特别是获取单词,而不是次数(即键的值)。 字符串mostRepeatedWord     = list.stream()           .collect(Collectors.groupingBy(w - &gt; w,Collectors.counting()))           .entrySet()           。流()           的.max(Comparator.comparing(输入::的getValue))           。得到()           .getKey();

答案 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;
  }
}

应该这样做。