2017-07-27 9 views
0

y-yとz-zの座標の範囲をHashMapの単一のキーとして保存する必要があるコードがあります。マップに範囲の整数の範囲を格納する方法

現在、私はすべてのyとzの座標を繰り返しています。それらをタプルでラップし、そのタプルをキーとして指定された値に保存します。しかし、メモリ使用量が問題になる可能性があるため、これは効率的ではないようです。

私はyの範囲が50-100であり、zの範囲も50-100であるとします。 yとzの範囲を格納することは可能ですか?有効な例(75,75)として、範囲にマップされた値を取得しますか? 101,101は無効な例になります。

最後に、キーペアがxまたはzと重複しないようにする必要もあります。

私が困惑しているように誰もがこれで私を助けることができれば、非常に感謝しています。

よろしく

+0

あなたには、いくつかのキー/値ペアの例を与えることができますか?理解できない – azro

+0

[最小限で完全であり、検証可能な例](https://stackoverflow.com/help/mcve)を教えてください。私はあなたが何をしようとしているのか分かりません –

+0

@azroキーは 'new Tuple(new Range(25,75)、new Range(25、75))'となり、値は任意のオブジェクト。私は、直接反復を使用することなくタプルクラスの両方の値の範囲内にある2つの指定されたintのキーから値を取得できるようにしたいとします。 –

答えて

0

私はあなたの実装から、いくつかの仮定をした:

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倍低い)

  • +0

    それは私が行っていたものです。しかし、これは良いパフォーマンスが上がるだろうか?地図上の多くのオブジェクトを使って少なくとも1000回以上これを実行する必要があるためです。 –

    +0

    マップ内のオブジェクトの数はどれくらいですか?私はあなたに1000の値を得る時間を試してみます – azro

    +0

    約3000があります –

    関連する問題