【问题标题】:Java MultipMap single key with multiple valueJava MultipMap 具有多个值的单键
【发布时间】:2014-09-14 07:56:59
【问题描述】:

我正在开发 java 应用程序,这是一个非常基本的测试工具。我们需要做的是我们必须在地图列表中使用单个键存储多个值,例如 'key,value,value' 即 '1,www.google.com,test', '2,www.gmail.com ,测试'等等。此外,一旦该过程完成,我们需要修改各个键的值(测试)。

有什么方法可以做到这一点,我在谷歌上搜索并找不到它正常工作'https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/MultiMap.html'

如果您能给我示例代码以及您的宝贵答案,我将不胜感激。

代码:

导入 org.apache.commons.collections.map.MultiKeyMap;

公开课测试{

static MultiKeyMap masterLinkList = new MultiKeyMap();
static String fetchUrl, urlStatus, urlMessage;

public static void main(String[] args) {
    // TODO Auto-generated method stub

    masterLinkList.put(1,"www.google.com", "Test");
    masterLinkList.put(2,"www.gmail.com", "Test");

    System.out.println(masterLinkList.get(1));

    masterLinkList.put(2,"www.gmail.com", "Test");

    if(masterLinkList.containsKey(1)&&masterLinkList.containsValue("Test")){
        masterLinkList.put(1,"www.gmail.com", "Passed");
    }
    System.out.println(masterLinkList.get(1));
}

}

谢谢,

【问题讨论】:

  • 你能把你试过的代码贴在这里吗?
  • MultiMap 运行良好 - 你有什么问题? --- 但是您可以毫不费力地实现Map<Integer,List<String>> 或类似的。你为什么没试过?
  • 根据我的理解,您必须构建类似于 Map 的结构,并且您的对象包含前两个值

标签: java arraylist multidimensional-array guava maplist


【解决方案1】:

Google Guava 提供了几个运行良好的 Multimap 实现,只需查看文档:http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html

详解:https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Multimap

示例:

Multimap<String,String> myMultimap = ArrayListMultimap.create();
// Adding some key/value
myMultimap.put("Fruits", "Bannana");
myMultimap.put("Fruits", "Apple");
myMultimap.put("Fruits", "Pear");
myMultimap.put("Vegetables", "Carrot");

// Getting the size
int size = myMultimap.size();
System.out.println(size);  // 4

// Getting values
Collection<string> fruits = myMultimap.get("Fruits");
System.out.println(fruits); // [Bannana, Apple, Pear]

Collection<string> vegetables = myMultimap.get("Vegetables");
System.out.println(vegetables); // [Carrot]

// Iterating over entire Mutlimap
for(String value : myMultimap.values()) {
 System.out.println(value);
}

// Removing a single value
myMultimap.remove("Fruits","Pear");
System.out.println(myMultimap.get("Fruits")); // [Bannana, Pear]

// Remove all values for a key
myMultimap.removeAll("Fruits");
System.out.println(myMultimap.get("Fruits")); // [] (Empty Collection!) 

【讨论】:

    【解决方案2】:

    你可以使用java核心类:

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class MultiMap {
        public static void main(String[] args) {
            final Map<String, List<String>> map = new HashMap<String, List<String>>();
    
            final List<String> valSetOne = new ArrayList<String>();
            valSetOne.add("www.google.com");
            valSetOne.add("test");
    
            final List<String> valSetTwo = new ArrayList<String>();
            valSetTwo.add("www.gmail.com");
            valSetTwo.add("Test");
    
            map.put("1", valSetOne);
            map.put("2", valSetTwo);
    
            final List<String> values = map.get("1");
            System.out.println("Before changing: " + values.get(1));
            values.set(1, "newTest");
            System.out.println("After changing: " + values.get(1));
        }
    }
    

    如何写在下面,您也可以使用 Google Guava Collections 或 Apache Commons Collection。比如看链接:http://java.dzone.com/articles/hashmap-%E2%80%93-single-key-and

    【讨论】:

      【解决方案3】:

      嗯,您描述的方式似乎可以通过使用 Map 结构来完成,其中您有一个映射到值列表的键。

      Map<String, List<String>> multiValues = new HashMap<>;
      List<String> values = new ArrayList<>;
      values.add("www.google.com");
      values.add("test");
      multiValues.put("1", values);
      

      但是,如果您想更改该键的任何值,则必须自己进行一些操作。如果您想找到一个支持单个键的多个值的类,您可以使用类似Google Guava's Multimap

      【讨论】:

        【解决方案4】:
        logger.info("Logging an INFO-about Directory exists or not.");
                processPropFile();
                String[] urls = prop.getProperty("URL").split(",");
                List<String> list = Arrays.asList(urls);
                String[] folder = prop.getProperty("DIRECTORY").split(",");
                List<String> folders = Arrays.asList(folder);
                for (int i = 0; i < folders.size(); i++) {
                    String k = folders.get(i);
                    File file = new File(k);
                    if (file.isDirectory()) {
                        logger.info("Connected to a Directory!"+folders.get(i));
                        if (file.list().length > 0) {
                            logger.info("Directory is not empty!");
                        } else {
                            logger.info("Directory is empty!");
                        }
                    } else {
                        logger.error("Invalid Directory!");
                        // System.out.println("This is not a directory");
                    }
                }
                return null;
        

        【讨论】:

          【解决方案5】:

          java.util.Map的键值必须是唯一的,我建议你实现自己的地图,像这样:

          class MyMap implements Map<Object, ArrayList<Object>> {
          }
          

          然后添加一个方法来放置一个元素,如下所示:

          public putOneElement(Object key, Object value) {
          this.get(key).put(value);
          }
          

          【讨论】:

            猜你喜欢
            • 2018-06-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-01
            • 1970-01-01
            • 2012-04-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多