不必要地在哈希映射中重复的值

时间:2017-01-24 04:26:24

标签: java hashmap repeat

主要计算:

for (String keyElement : mKeys) {

            int index = str_mFormatedString.indexOf(keyElement);
            sendTheDataToMap(keyElement, page, index);

            while (index >= 0) {  // indexOf returns -1 if no match found
                index = str_mFormatedString.indexOf(keyElement, index + 1);


                if (index >= 0) {
                    sendTheDataToMap(keyElement, page, index);
                }
            }
        }

sendDataToMap函数:

private void sendTheDataToMap(String key, int page, int index) {
    Pair mPair = new Pair(page, index);
    map.putIfAbsent(key, new ArrayList<>());
    map.get(key).add(mPair);
    //  System.out.println("Entry added to the map....");
}

Readmap功能:

 private void readMap() {
    for (Map.Entry<String, ArrayList<Pair<Integer, Integer>>> ee : map.entrySet()) {
        String key = ee.getKey();
        ArrayList<Pair<Integer, Integer>> values = ee.getValue();
        // Process the values

        System.out.print(key + " | ");
        for (Pair value : values)
            System.out.print(" " + value.getPage() + "." + value.getIndex());
        System.out.println();
    }
}

方法很简单,我从字符串中读取键的多个索引,并使用String,ArrayList<Pair<Integer, Integer>>将其添加到地图中。 我知道我在主要计算中或在读取导致重复值的地图时都犯了一些小错误。

示例输出:

  

可以| 5.167 5.223 5.167 5.223 7.157 7.338 7.751 7.157 7.338 7.751 7.157 7.338 7.751 15.558 16.209 16.436

突出显示是重复部分。

  

重点是,我不想在第一时间写出多个值,如果这里没有发生,那么我就不想读多个值。

任何帮助?

编辑1: 输入:在空间上滑动的字符串(基本上是任何字符串)。 例如:你好,你好吗? =&GT; [&#39;你好&#39;&#39;如何&#39;,&#39;是&#39;,&#39;你&#39;?]

主计算之前的一行:

 mKeys = splitTextToArray(str_mFormatedString);

和函数splitTextToArray()

private ArrayList<String> splittingTextToArray(String formattedTextInput) {
    String[] tempKeys = formattedTextInput.split("\\s+");

    //convert to Arraylist
    ArrayList<String> mKeys = new ArrayList<>(Arrays.asList(tempKeys));
    return mKeys;
}

2 个答案:

答案 0 :(得分:3)

使用Set代替List作为地图值,以避免重复:

Map<String, Set<Pair<Integer, Integer>>> map = new HashMap<>();
// ...
map.putIfAbsent(key, new HashSet<>()); // Or LinkedHashSet to preserve insertion order
map.get(key).add(mPair);

如果您真的非常喜欢使用列表,请在添加列表之前检查列表是否已包含该值:

Map<String, List<Pair<Integer, Integer>>> map = new HashMap<>();
// ...
map.putIfAbsent(key, new ArrayList<>());

if (!map.get(key).contains(mPair)) {
    map.get(key).add(mPair);
}

// probably should optimize this to get rid of the multiple calls to map.get(key)

但必须确保equals()课程的hashCode()Pair已正确实施。

答案 1 :(得分:1)

Arraylist可以包含重复的值,因此您可以使用设置,或者在放入arraylist之前检查 ,如下所示。

1)声明Set而不是Arraylist

map.putIfAbsent(key, new HashSet<>());

2)在加入arralist之前检查。 (为此你需要在Pair类中覆盖hascode和equals。)

private void sendTheDataToMap(String key, int page, int index) {
    Pair mPair = new Pair(page, index);
    map.putIfAbsent(key, new ArrayList<>());
  if(!map.get(key).contains(mPair){
    map.get(key).add(mPair);
    //  System.out.println("Entry added to the map....");
  }
}