在ArrayList中找到最常用和最少使用的字符串(不使用Hashmap)

时间:2014-09-11 11:38:52

标签: java arraylist

我无法在String中找到最常用且使用最少的ArrayList。该程序应该通过一个字符串文件,并计算列表中有多少个字符串。然后在列表中打印最少和最常用的名称。 ArrayList部分已完成。它只是找到了我遇到麻烦的最常见和最不常见的名字。我不知道如何开始它。我试过询问,但是我以HashMap的形式得到了它。我有点想弄明白,但这是我能想到的。

for (int i = 0; i< dogs.size(); i++)
if dogs.get(0).getName().equals dogs.get(i).getName();
{
   dogs.get(i).getName()++;    
 }

3 个答案:

答案 0 :(得分:2)

您可以先对列表进行排序,然后计算相同连续名称的数量。然后只保留最小和最大的数字..

ofcource hashmaps是这类问题的理想选择,除非你有一个很好的理由不能使用它,否则你应该使用hashmap这个

答案 1 :(得分:0)

您可以使用frequency()

例如:

 List<String> myList=new ArrayList<>();
 myList.add("a");
 myList.add("b");
 myList.add("a");
  for(String i:new HashSet<>(myList)){
     System.out.println(i+" has "+Collections.frequency(myList,i)+" times ");
  }

Out put:

 b has 1 times 
 a has 2 times 

您可以应用它来查找最多和最低的事件。

或者您可以使用HashMap

  List<String> myList = new ArrayList<>();
  myList.add("a");
  myList.add("b");
  myList.add("a");
    Map<String, Integer> map = new HashMap<>();
    for (String i : new HashSet<>(myList)) {
        Integer val = map.get(i);
        if (val != null) {
            map.put(i, val + 1);
        } else {
            map.put(i, 1);
        }
    } 

您将获得所有String

的值

答案 2 :(得分:0)

这是依靠Java Streams API解决问题的方法:

final SortedSet<Entry<String, Long>> s =
    lineList.stream().collect(groupingBy(identity(), counting())).entrySet()
    .stream().collect(toCollection(()->new TreeSet<>(comparing(Entry::getValue))));
System.out.println(s.first() + ", " + s.last());

或者,如果您可以从读取文件的位置重新开始,这会更好,因为它会跳过您首先创建行列表并直接构建频率映射的步骤:

try (BufferedReader r = Files.newBufferedReader(Paths.get("input.txt"))) {
  final SortedSet<Entry<String, Long>> s =
      r.lines().collect(groupingBy(identity(), counting())).entrySet().stream()
      .collect(toCollection(()->new TreeSet<>(comparing(Entry::getValue))));
  System.out.println(s.first() + ", " + s.last());
}

注意:这是上述代码所需的静态导入列表:

import static java.util.Comparator.comparing;
import static java.util.function.Function.identity;
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toCollection;