0

現在、文字列をHashSetに格納していますが、各文字列を日付オブジェクトとペアにしたいと思います。日付は減衰タイマーとして使用されます(文字列の日付を設定して、その日が経過した後に削除できるようにします)。プログラムが起動したら、リストを繰り返し処理してすべての文字列の日付を確認し、期限切れの文字列を削除します。

リストを反復処理できる2タプルのデータ構造があり、containsメソッドがありますか?

また、セットではなくリストデータ構造に切り替えすぎ.contains(string)た場合、文字列が存在するかどうかを確認するメソッドを持つHas​​hSetと比較して、データ構造の反復はパフォーマンスにどの程度影響しますか?チェックは比較的迅速である必要があり、できれば1秒未満である必要があります。

4

4 に答える 4

2

あなたはこれを使ってみることができます:

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

マップのすべての要素を反復処理する場合:

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

Setの代わりにListを使用することをお勧めします。これは、要素がSetにすでに存在するかどうかを確認するために、常に関数呼び出しを行うためです。したがって、重複について気にしない場合は、リストに移動してください。

于 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");

ここで他の機能をチェックしてください ハッシュマップJavaドキュメント

于 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 に答える