0

我目前将字符串存储在 HashSet 中,但我想将每个字符串与日期对象配对。该日期将用作衰减计时器(为字符串设置一个日期,以便在该天过去后可以将其删除)。当程序启动时,我想遍历列表并检查所有字符串的日期,删除那些已经过期的。

是否有一个 2 元组数据结构可以让我遍历列表并具有 contains 方法?

另外,如果我太切换到列表数据结构而不是集合,那么与 HashSet 相比,迭代数据结构对性能有多大影响,HashSet.contains(string)在尝试找出字符串是否存在时具有方法?检查需要相对较快,最好在一秒钟内。

4

4 回答 4

2

你可以尝试使用这个:

        Map<Date,List<String>> map = new HashMap<Date,List<String>>();

用于迭代 map 中的所有元素:

for (Date date : map.keySet()) {
        // Check with current date and remove from map if date has expired
        }

我建议你使用 List 而不是 Set,因为它总是会调用函数来检查元素是否已经存在于 Set 中。因此,如果您不担心重复项,请选择 List。

于 2013-03-15T18:49:39.497 回答
1

我发现一个泛型Pair类非常有用:

public class Pair<T, R> {

    T first;
    R second;

    public Pair(T first, R second) {
        this.first = first;
        this.second = second;
    }

    public T getFirst() {
        return first;
    }

    public R getSecond() {
        return second;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Pair pair = (Pair) o;

        if (first != null ? !first.equals(pair.first) : pair.first != null) return false;
        if (second != null ? !second.equals(pair.second) : pair.second != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = first != null ? first.hashCode() : 0;
        result = 31 * result + (second != null ? second.hashCode() : 0);
        return result;
    }
}
于 2013-03-15T18:55:12.157 回答
1

用一个

Map<String,Date> stringDateMap = new HashMap<String,Date>();

而不是一个集合,因为一个集合不做任何映射。

您可以通过这样做放入更多数据:

stringDateMap.put("Key1", new Date());

您可以通过以下方式删除相同的数据:

stringDateMap.remove("Key1");

在此处查看其他功能 Hash Map Java Doc

于 2013-03-15T18:46:33.393 回答
1

java中没有元组,但是你可以很容易地创建一个自己。

public class StringDatePair {

    private final String str;
    private final Date date;

    public StringDatePair(String str, Date date) {
        this.str = str;
        this.date = date;
    }

    public getString() {
        return str;
    }
    public getDate() {
        return date;
    }
}

如果您想在列表中使此元组可排序,您可以实现Comparable并按日期进行比较。

在检查包含时,集合比列表更快,并且随着集合/列表的内容变大,差异会变大。但是必须有非常大量的内容才能使运行时间> 1 秒来检查列表中是否存在项目。

此外,如果您最终使用按日期对项目进行排序的列表,您可以从头开始迭代列表,当您找到日期未过期的第一个项目时,您可以丢弃所有较早的项目。

于 2013-03-15T18:50:07.143 回答