我有一份列有条目的清单如下:
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-10destinations=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的视图。因为我不想在每个搜索请求上查询数据库。
发布于 2017-08-23 11:00:30
番石榴的Multiset或Multimap实现可能会派上用场:
https://github.com/google/guava/wiki/NewCollectionTypesExplained
更好的是,apache JXpath:
http://commons.apache.org/proper/commons-jxpath/
发布于 2017-08-23 11:05:17
你在用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;
}
}https://stackoverflow.com/questions/45837660
复制相似问题