如何缓存列表中对象属性的查找?

时间:2017-08-23 10:51:59

标签: java

我有一个包含条目的列表,如下所示:

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的视图。因为我不想在每个搜索请求上查询数据库。

2 个答案:

答案 0 :(得分:1)

Guava的Multiset或Multimap实现可能派上用场:

https://github.com/google/guava/wiki/NewCollectionTypesExplained

更好的是,apache JXpath:

http://commons.apache.org/proper/commons-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;
    }

}