簡體   English   中英

比較以char數組作為值的映射-Java

[英]Compare maps with char array as values - Java

我現在正在玩hashmap。 我試圖弄清楚如何比較兩個哈希圖的值-當每個哈希圖的值是一個char數組時。 我環顧四周發現了一些可能有效的方法-我只是不確定如何正確實現。 基本上,我有兩個具有不同鍵但值相同的地圖。 我想遍歷其中一張地圖,並創建一個布爾值,如果它們具有相同的值,則返回true。 如果有人可以幫助我解決這個問題,那就太好了。 下面是我到目前為止嘗試過的代碼:

publipublic class MapExample {

public static void main(String[] args) {

    Map<String, char[]> map1 = new HashMap<String, char[]>();
    Map<String, char[]> map2 = new HashMap<String, char[]>();

    char[] letters1 = new char[3];
    letters1[0] = 'a';
    letters1[1] = 'b';
    letters1[2] = 'c';

    char[] letters2 = new char[3];
    letters2[0] = 'x';
    letters2[1] = 'y';
    letters2[2] = 'z';

    map1.put("1", letters1);
    map1.put("2", letters2);
    map1.put("3", letters1);

    map2.put("4", letters1);

    Set s = map1.entrySet();
    Iterator it = s.iterator();

    boolean containsValue;

    //I've tried this but it produces false (and infinite loop) when maps have the same value
    while (it.hasNext()) {

        containsValue = map1.equals(map2.values());
        System.out.println(containsValue);
    }

    //I've tried this too, but can't seem to adjust the lists to accept char[]
    /*
    List<String> values1 = new ArrayList<String>(map1.values());
    List<String> values2 = new ArrayList<String>(map2.values());
    Collections.sort(values1);
    Collections.sort(values2);
    boolean mapsHaveEqualValues = values1.equals(values2);*/

}
 }

無限循環

您需要使用it.next()來推進Iterator 您一直在迭代器上調用hasNext()而不將其轉發到下一個元素。

hasNext()

如果迭代具有更多元素,則返回true。 (換句話說,如果next()將返回一個元素而不是引發異常,則返回true。)

next()

返回迭代中的下一個元素。

while (it.hasNext()) { 
    // need to use it.next() somewhere, but you don't really need loop here
    containsValue = map1.equals(map2.values());
    System.out.println(containsValue);
}

map1.equals(map2.values());

我認為您想做的是map1.values().equals(map2.values());

List<String> values1 = new ArrayList<String>(map1.values());

定義一個Character[]而不是char[]並將其添加到Map<String, Character[]> map1和列表List<Character[]> values1 = new ArrayList<Character[]>(map1.values());

containsValue = map1.equals(map2.values());

應該:

containsValue = map1.values().equals(map2.values());

while(it.hasNext())在您的代碼中是無用的,並且您沒有在循環內使用迭代器。 關於定義char[]的列表,請使用:

List<char[]> list;

從所有錯誤的地方開始。

char[]上調用Object.equals僅在它們完全相同的對象而不考慮內容的情況下才返回true 我注意到您並不依賴於此。

您正在使用迭代器,但從未調用next 最好使用豪華的循環。

您正在將一個Map與一個Collection進行比較( Map (通常不是Collection ),所以這是行不通的。

Map.valuesCollection是一個包,只有java.util.Bag沒有。 因此,它恰好使用默認的Object.equals ,甚至不會將其與具有從另一個Map.values返回的相同元素的集合進行比較(除非它是完全相同的實例)。

如果您嘗試比較兩個values集合,那么我們會遇到問題。 通過將一個集合復制到HashSet ,然后調用retainAll我們可以輕松看到常見元素。 要進行包比較,您很容易就必須使用第三方庫(Guava可能不是我自己使用的)或自己實現算法。 說,復制到Lists ,並使用兩個迭代器一次對它們進行排序和迭代。

暫無
暫無

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

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