我想知道如何搜索字符串的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
}
我在制作算法以搜索数组中最常出现的字符串时遇到问题,或者如果存在平局字符串则会出现字符串;然后显示找到该字符串的“行程对象”(参数值)的编号。任何帮助都会很棒,谢谢!!
答案 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);
System.out.println(
Seq.seq(itinerary)
.flatMap(i -> Seq.seq(i.iterator()))
.map(s -> s.getDestination().toLowerCase().replace(" ", ""))
.mode()
);
(免责声明:我为jOOλ背后的公司工作)