【问题标题】:How to allow duplicate values in Map java?如何在 Map java 中允许重复值?
【发布时间】:2018-08-23 10:38:47
【问题描述】:

我正在使用 Autocompletetextview,所以我希望显示重复的名称...名称来自服务器...我尝试了下面的一些 java 代码示例,但它不起作用...

public class EmptyActivity extends AppCompatActivity {

    LinkedHashMap<String, ArrayList<String>> hashMap_searchresult = new LinkedHashMap<String, ArrayList<String>>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_empty);
        hashMap_searchresult.clear();

        hashMap_searchresult.put("a1",new ArrayList<String>(Arrays.asList("a","b","c","d")));
        hashMap_searchresult.put("a1",new ArrayList<String>(Arrays.asList("e","f","g","h")));

        for (Map.Entry<String, ArrayList<String>> entry : hashMap_searchresult.entrySet()) {
            String key = entry.getKey();
            ArrayList<String> value2222 = entry.getValue();
            Log.e("checkstatus"," key    " + key + " value : " + value2222.toString());
        }
    }
}

这是输出得到

键:a1 值:[e, f, g, h]


但我想要这样的输出

 key :  a1  value : [a, b, c, d]
 key :  a1  value : [e, f, g, h]

谁能告诉我应该用什么来做这个?

【问题讨论】:

    标签: java android collections


    【解决方案1】:

    这越来越难看,但你可以给你一张列表列表的地图:

    LinkedHashMap<String, List<List<String>>> hashMap_searchresult = new LinkedHashMap<>();
    
    List<List<String>> list = new ArrayList<>();
    list.add(new ArrayList<String>(Arrays.asList("a", "b", "c", "d")));
    list.add(new ArrayList<String>(Arrays.asList("e", "f", "g", "h")));
    hashMap_searchresult.put("a1", list);
    
    for (Map.Entry<String, List<List<String>>> entry : hashMap_searchresult.entrySet()) {
        String key = entry.getKey();
        List<List<String>> value2222 = entry.getValue();
        for (List<String> lst : value2222) {
            String[] arr = new String[list.size()];
            arr = lst.toArray(arr);
            System.out.println("checkstatus" + " key    " + key + " value : " + Arrays.toString(arr));
        }
    }
    

    Demo

    【讨论】:

      【解决方案2】:

      您或许可以尝试以下类型的集合:

      LinkedHashMap<String, ArrayList<ArrayList<String>>> hashMap_searchresult = new LinkedHashMap<String, ArrayList<ArrayList<String>>>();
      

      这意味着您可以创建字符串列表作为值,因此可以在那里放置多个列表。但是在处理此类数据时需要小心(尤其是在初始化列表时)。

      Set<String> keySet = hashMap_searchresult.keySet();
      Iterator<String> iterator = keySet.iterator();
      while(iterator.hasNext())    {
          String key = iterator.next();
          ArrayList<ArrayList<String>> outerList = hashMap_searchresult.get(key);
          for(int index=0;index<outerList.size();index++)    {
              ArrayList<String> innerList = outerList.get(index);
              Log.e("checkstatus"," key    " + key + " value : " + innerList.toString());
          }  
      
      }
      

      【讨论】:

      • @Tim Biegeleisen 他给了我非常清晰的代码......所以我给了你upvote..非常感谢你
      【解决方案3】:

      要将多个列表作为同一个键的值,您需要将它们放入某种容器中,例如另一个列表。这意味着您将拥有如下的地图类型:

      Map<String, List<List<String>>>
      

      现在您可以添加和删除特定键的列表。但请记住,您必须先为每个键创建一个列表,然后再使用它。

      【讨论】:

        【解决方案4】:

        您可以尝试使用 google MultiMap 来简化代码。 参考:https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Multimap.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-11
          • 2012-05-27
          • 1970-01-01
          • 1970-01-01
          • 2015-10-20
          • 1970-01-01
          • 1970-01-01
          • 2017-06-08
          相关资源
          最近更新 更多