我有一个包含条目的列表,如下所示:
public class Entry {
private String origin;
private String destination;
private Date date;
}
我希望能够独立搜索每个属性,并相应地显示所属的条目。
示例:
#origin, destination, date
berlin, newyork, 2017-10-10
berlin, london, 2017-10-10
sydney, barcelona, 2017-10-10
如果有人搜索" origin = berlin",我想显示:destinations=newyork, london; date=2017-10-10
。
搜索destination=london
会产生origin=berlin; date=2017-10-10
。
date=2017-10-10
的搜索应显示origin=berlin, sydney; destination=newyork, london, barcelona
。问题:如何实现此内存(我不能使用例如mysql
数据库)?
当然,每次搜索请求进入时我都可以迭代所有对象,例如:
List destinations;
List dates;
for (entry : entries) {
if (entry.origin.equals("berlin")) {
destinations.add(entry.destination);
dates.add(entry.date);
}
}
但我更喜欢缓存的解决方案,因此我不必在每次搜索时重新创建它们(并且还节省时间)。
旁注:Entry
列表是SELECT DISTINCT origin, dest, date from table
的视图。因为我不想在每个搜索请求上查询数据库。
答案 0 :(得分:1)
Guava的Multiset或Multimap实现可能派上用场:
https://github.com/google/guava/wiki/NewCollectionTypesExplained
更好的是,apache JXpath:
答案 1 :(得分:0)
您使用的是Java8吗?如果是这样,流应该能够做到(我刚刚过滤了原点,但示例可以扩展到所有字段......):
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
public class Combinations {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<Entry> list = new ArrayList<>();
list.add(new Entry("berlin", "newyork", sdf.parse("2017-10-10")));
list.add(new Entry("berlin", "london", sdf.parse("2017-10-10")));
list.add(new Entry("sydney", "barcelona", sdf.parse("2017-10-10")));
System.out.println(list);
String filterOrigin = "berlin";
System.out.println(list.stream().filter(e -> e.getOrigin().equals(filterOrigin)).collect(Collectors.toList()));
}
}
class Entry {
private String origin;
private String destination;
private Date date;
public Entry(String origin, String destination, Date date) {
super();
this.origin = origin;
this.destination = destination;
this.date = date;
}
@Override
public String toString() {
return "Entry [origin=" + origin + ", destination=" + destination + ", date=" + date + "]";
}
public String getOrigin() {
return origin;
}
public void setOrigin(String origin) {
this.origin = origin;
}
public String getDestination() {
return destination;
}
public void setDestination(String destination) {
this.destination = destination;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}