私はあなたの実装から、いくつかの仮定をした:
public class Range {
private final int from;
private final int to;
}
// - - AND - -
public class Tuple {
private final Range rf;
private final Range rt;
}
私は、次のメソッドを追加することを提案する:
// In Range class
public boolean isValid(int x) {
return (from <= x) && (x <= to);
}
//-----------------------------------------------------------------
// In Tuple class
public boolean isValid(int x, int y) {
return rf.isValid(x) && rf.isValid(y);
}
そして、自分のものを管理するためのクラスを:
public class TupleGestion {
private static final Map<Tuple, String> map = new HashMap<>();
private static String getValue(int x, int y) {
return map.get(map.keySet().stream()
.filter(key -> key.isValid(x, y)).findAny().orElse(null));
}
public static void main(String[] args) {
map.put(new Tuple(new Range(25, 75), new Range(25, 75)), "foo");
System.out.println(getValue(0, 0)); // null
System.out.println(getValue(50, 0)); // null
System.out.println(getValue(0, 50)); // null
System.out.println(getValue(50, 50)); // foo
}
}
この鍵を読み取ってあなたのattempに対応する鍵を見つけ、2つの鍵を持っています。それは使用getValue()
にかかる時間を計算する<5ms
使用nanoTime()
:
- は、マップ内の6000個のランダムな要素を追加:パフォーマンス - 両方の範囲
EDITに
getValue()
:20000回:100ms< t < 150ms
System.out.println(getValue())
20000回:850ms< t <1sec
あなたは3000の要素1000 getValue()
について尋ねた:<5ms
(1秒よりも200倍低い)
あなたには、いくつかのキー/値ペアの例を与えることができますか?理解できない – azro
[最小限で完全であり、検証可能な例](https://stackoverflow.com/help/mcve)を教えてください。私はあなたが何をしようとしているのか分かりません –
@azroキーは 'new Tuple(new Range(25,75)、new Range(25、75))'となり、値は任意のオブジェクト。私は、直接反復を使用することなくタプルクラスの両方の値の範囲内にある2つの指定されたintのキーから値を取得できるようにしたいとします。 –