簡體   English   中英

具有多個值鍵的HashMap

[英]HashMap with multiple valued keys

是否可以創建一個HashMap,其鍵是整數數組?

我習慣於使用Python,最近我開始使用Java。 在我的工作中,我需要使用以下鍵創建一個HashMap:

map.put([5,2], 1);
map.put([3,2], 0);

等等。 我正在使用它來稍后測試地圖中是否存在一對數字,如果是,則執行某些操作,如果不存在,請繼續。

為此,我嘗試了以下操作:

Map<Array, Boolean> test = new HashMap<Array, Boolean>();
int[] a1 = {5,2};
test.put(a1, true);

Eclipse給出消息(“參數不適用於int [] ...”)。 但是我做的任何配置都會出現一些錯誤。

我嘗試使用ArrayList,地圖內的對象,嵌套的HashMap等,但均無用(在python中,這很簡單,我只寫dict [(5,2)] = 1,所以我想在Java中可以做到)像這樣簡單的東西)。 建議我將數字轉換為字符串,然后在其間添加一個冒號,例如:

map.put("5:2", 1);

然后我再次打破字符串,但是如果這是解決方案,我將回到Python;)!

可能這是一個非常簡單的問題,但我找不到答案,希望您能幫助我。

提前致謝!

如果要檢查條目是否存在,可以使用Set (一個有用的具體實現是HashSet

final Set<List<Integer>> population;

population = new HashSet<List<Integer>>();
population.add(Arrays.asList(1, 2));

if (population.contains(Arrays.asList(1, 2)))
{
  ...
}

您可以像上面所做的那樣使用List -但這不能保證所有列表的長度都恰好是兩個元素(如果確實是一個約束)。 為了使它更加健壯,您可以創建自己的類來表示元組。 如果這樣做,請確保實現equals()hashCode() (這是一篇介紹最佳做法文章 )。

Arrays.asList()是在代碼中內聯創建列表的有用方法。 更一般的列表是ArrayList

最簡單的事情是Map<List<Integer>, Boolean> -甚至只是Set<List<Integer>> ,因為您不關心值是否等於鍵是否在那里。

更多的java-y解決方案將是一些表示兩個int的類:

public class Coordinate { // or whatever
    private final int x;
    private final int y;

    // constructor and overrides for equals, hashCode and toString
}

然后有一個Set<Coordinate>

這在Java上更慣用了,因為類名准確地告訴您此集合的用途-並強制以這種方式使用它。 另一方面, Set<List<Integer>>可能有很多事情:坐標,彩票領取,給定部門人員的SSN,付款用的信用卡...程序員無法知道通過查看類型,很容易獲得一組數字,這意味着在某種情況下意外地使用事物。 Set<Coordinate>只能是一組坐標。

這有效:

Map<List<Integer>,Boolean> map = new HashMap<>();
map.put( Arrays.asList( new Integer(1), new Integer(2) ), false );
map.put( Arrays.asList( 4, 5 ), true ); // Integer type is inferred and ints are autoboxed

map.get( Arrays.asList( 1, 2 ) ); // gets the Boolean object for "false"

實際上,java比python缺乏表現力,因此您必須編寫更多代碼。

我認為您需要通過以下方式使用帶有ArrayList的映射:

ArrayList al = map.get("key");
if (al == null) {
    al = new ArrayList();
    map.put("key", al)
}
al.add(some_object);

您也可以使用數組作為鍵(按要求),可能需要一個不可變的數組。 哈希映射起作用的關鍵是使用具有equalshashCode的良好實現的某些對象。

這是在Java中完成的方式,盡管您可以使用任何種類的集合,但集合更為常見。

干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM