在数组列表中搜索最常见的String

时间:2010-02-18 19:52:19

标签: java

我想知道如何搜索字符串的ArrayList以找到我创建的“行程”对象中最常出现的“目的地”(其中包含不同目的地的列表。)

到目前为止,我有:

public static String commonName(ArrayList<Itinerary> itinerary){

    int count = 0;
    int total = 0;

    ArrayList<String> names = new ArrayList<String>();
    Iterator<String>itr2 = names.iterator();

    while(itr.hasNext()){ 

        Itinerary temp = itr.next();  

        if(temp.iterator().hasNext()){ //if its has destinations

                // Destination object in itinerary object 
                Destination temp2 = temp.iterator().next(); 
                String name = temp2.getDestination().toLowerCase().replace(" ", "");

                if(names.contains(name)){
                    count = count + 1;
                    //do something with counting the occurence of string name here
                }

我在制作算法以搜索数组中最常出现的字符串时遇到问题,或者如果存在平局字符串则会出现字符串;然后显示找到该字符串的“行程对象”(参数值)的编号。任何帮助都会很棒,谢谢!!

4 个答案:

答案 0 :(得分:8)

我会做一个HashMap<String,Integer>。然后我将浏览每个行程,如果目的地不在地图中,我会创建一个带有put(目的地,1)的条目,否则我会增加那里的数量与put(目的地,获取(目的地)+ 1)。之后我会浏览Map条目并查找计数最高的那个。

答案 1 :(得分:0)

如果您不介意使用外部jar,可以使用apache commons中的HashBag轻松完成此操作。

public static String commonName(ArrayList<Itinerary> itinerary){

int count = 0;
int total = 0;
Bag names = new HashBag();

while(itr.hasNext()){ //while array of Itinerary object has next
    Itinerary temp = itr.next();  //temp = 1st itineray object
    if(temp.iterator().hasNext()){ //if its has destinations
            Destination temp2 = temp.iterator().next(); //n Destination object in itinerary object 
            String name = temp2.getDestination().toLowerCase().replace(" ", "");
            names.add(name, 1);
    }
}

然后你可以调用names.getCount(“destination1”)来获取destination1的出现次数

请参阅http://commons.apache.org/collections/userguide.html#Bags

答案 2 :(得分:0)

尝试lambdaj库的群组功能。要解决您的问题,您可以将目标属性上的Itenarary对象分组,然后找到具有最大大小的组,如下例所示:

Group<Sale> group = selectMax(group(itineraries, 
    by(on(Itenarary.class).getDestination())).subgroups(), on(Group.class).getSize());

答案 3 :(得分:0)

In statistics, this is called the "mode"。 vanilla Java 8解决方案如下所示:

itinerary
      .stream()
      .flatMap(i -> StreamSupport.stream(
          Spliterators.spliteratorUnknownSize(i.iterator(), 0)
      ))
      .collect(Collectors.groupingBy(
          s -> s.getDestination().toLowerCase().replace(" ", ""), 
          Collectors.counting()
      ))
      .entrySet()
      .stream()
      .max(Comparator.comparing(Entry::getValue))
      .ifPresent(System.out::println);

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

System.out.println(
    Seq.seq(itinerary)
       .flatMap(i -> Seq.seq(i.iterator()))
       .map(s -> s.getDestination().toLowerCase().replace(" ", ""))
       .mode()
);

(免责声明:我为jOOλ背后的公司工作)