2013-04-16 55 views
0

第一篇文章,我對Java(以及一般編程)非常陌生!基於地圖中TreeSet中值的範圍返回鍵

我想了解如何操作地圖,當他們包含其他集合。我試圖編寫代碼來存儲名稱作爲鍵的值,這些值是映射中的整數集。然後我希望能夠返回任何具有落在給定範圍內的元素的值的鍵。

Map<String, Set<Integer>> index = new TreeMap<>(); 
Set<Integer> numbers = new TreeSet<>; 

numbers.add(80); 
numbers.add(90); 
numbers.add(100); 
index.put("Adam", numbers); 

numbers = new TreeSet<>(); 
numbers.add(30); 
numbers.add(40); 
numbers.add(50); 
index.put("Eve", numbers); 

我現在有與鍵 「亞當」 和值的條目[80,90,100],並用鍵 「EVE」 和值[30,40,50]另一條目的地圖。至少我覺得我有!

我現在想要能夠返回任何鍵落在給定範圍內的鍵的名稱。

例如,如果範圍是25到50,則返回將是「Eve」。 如果範圍是50到85,則回報將是「亞當」和「夏娃」。

我以爲containsValue()可能工作,但沒有(因爲Set?)。

任何指導,將不勝感激。

+0

不知道任何關於您的問題域: 你認爲逆 - 使用數字作爲鍵,和一組名稱爲您的樹形圖中值? 鑑於您的描述,這似乎適合您使用它的方式。 – fspinnenhirn

+0

謝謝,你的問題剛剛突出了另一個問題。可能有重複的值,所以我不能做你的建議,但我也不能使用TreeSet。我想我需要一個ArrayList? – GATDev

+0

如果你想避免重複,你會使用Set而不是List;並且只有在需要對它進行排序(通過可比較的東西)時,纔會使用基於樹的集合實現(TreeMap,TreeSet)。 一般情況下,首先確定是否需要一個List,Set和地圖,然後看看常見的ArrayList,HashMap的或HashSet的就夠了。只有他們不這樣做,請考慮使用基於樹或LinkedList的集合實現。 – fspinnenhirn

回答

0

我不認爲你將能夠用任何標準的地圖方法來完成此任務。特別是,地圖非常適合通過密鑰訪問,而不是通過價值。

我認爲在這種情況下,您最好創建一個自定義對象的列表。自定義對象將包含值列表和字符串。當你想要得到所有具有該範圍內的值的字符串時,你需要遍歷列表並用匹配的列表填充一個新列表。

下面是它會是什麼樣子:

List<RangedString> index = new ArrayList<RangedString>(); 
... 
public List<String> getStringInRange(int low, int high) { 
    List<String> results = new ArrayList<String>(); 
    for (RangedString rangedString : index) { 
     if (rangedString.inRange(low, high)) { 
      results.add(rangedString.getString()); 
     } 
    } 
} 

RangedString.inRange方法是這樣的:

Set<Integer> values; 
... 
public boolean inRange(int low, int high) { 
    for (Integer value : values) { 
     if (value >= low && value <= high) { 
      return true; 
     } 
    } 
    return false; 
} 
0

我第一眼

1覺得這個算法)做一個存儲關鍵結果的Hashset

2)Iterat e thu地圖,然後是每個set的元素。

3)將它與輸入範圍進行比較。

4)如果它在那裏添加它在哈希集。

5)多數民衆贊成它

這裏使用HashSet的,因爲這將確保唯一鍵的結果。

+0

嗨,這聽起來像我一直在試圖做的(沒有成功)。我遍歷地圖,然後遍歷集合中的每個元素,將每個元素與輸入範圍進行比較,只給出我需要的值。你能解釋一些關於如何使用這些值將相關密鑰放入Hashset的問題嗎? – GATDev

0

您必須編寫一個自定義邏輯,遍歷映射中每個條目的每個集合,並在條目落在所需範圍內時獲取條目的相應鍵。

+0

嗨,我試圖通過各組在地圖中的每個條目迭代,可以隔離在上述範圍內的值。在獲取相應的密鑰時,我只是迷失了方向? – GATDev

1

不改變你德興我能想到的唯一的辦法就是通過地圖,並設置每個值進行迭代,但它不是非常有效:

public Set<String> containsRange(Map<String, Set<Integer>> index, int lowerBound, int upperBound){ 
    Set<String> result = new HashSet<>(); 
    for (Map.Entry<String, Set<Integer>> entry : index.entrySet()) { 
     String string = entry.getKey(); 
     for (Integer integer : entry.getValue()) { 
      if (integer >= lowerBound && integer <= upperBound) { 
       result.add(string); 
       break; 
      } 
     } 
    } 
    return result; 
} 

未經測試。