插入列表作为值的地图

问题描述:

我得到一个List<String>形式休眠,其中包含completeFileAddress插入列表作为值的地图

CompleteFileAddress我从List得到的是:

192.168.1.1/var/local/files/20140116/8800399421_4007_20140116_151718 
192.168.1.2/var/local/files/monitor/20140115/9654180710_4006_20140115 
192.168.1.1/var/local/files/20140116/8800399421_4007_20140116_120042 
192.168.1.1/var/local/files/20140116/138_4007_20140116_122719 

然后我分裂CompleteFileAddress得到IPAddressFilePath分开,并投入Map<String, List<String>>的值,其中关键是IPAddress和值是FilePath名单。

我的代码是:

List list = criteria.list(); 
      for (Iterator it = list.iterator(); it.hasNext();) { 
       String completeFileAddress = (String) (it.next()); 
       System.out.println("Complete add : " + completeFileAddress); 
       if (completeFileAddress != null) { 
        int index = completeFileAddress.indexOf("/"); 
        String serverIP = completeFileAddress.substring(0, index); 
        String filePath = completeFileAddress.substring(index, completeFileAddress.length()) + ".WAV"; 
        filesMap.put(serverIP, sourceFileList); //sourceFileList is declared as an instance variable 
        sourceFileList.add(filePath); 
       } 
      } 
     System.out.println("List '1' size :" + filesMap.get("192.168.1.1").size()); 
     System.out.println("List '2' size :" + filesMap.get("192.168.1.2").size()); 

我得到两个List的尺寸为4,但我想的List1 = 3List2 = 1大小,因为我对服务器192.168.1.1 3个文件,只有一个在192.168.1.2

我该如何做到这一点???

  • 你把相同keyvalue一对地图和指同一个列表这两个键。
  • 您可以检查地图包含的关键,如果它存在只是检索值(即列表),并添加filePath该名单
  • 如果键不存在,则创建新的列表,并添加filePath到新创建的列表中,最后加keyvalue映射

试试这个代码

String serverIP = completeFileAddress.substring(0, index); 
String filePath = completeFileAddress.substring(index, completeFileAddress.length()) + ".WAV"; 
if(filesMap.containsKey(serverIP)) 
{ 
    ArrayList<String> sourceList = filesMap.get(serverIP); 
    sourceList.add(filePath); 
} 
else 
{ 
    ArrayList<String> sourceList = new ArrayList<String>(); 
    sourceList.add(filePath); 
    filesMap.put(serverIP, sourceFileList); 
} 

您正在为地图中的所有条目使用相同的List对象。相反,如果地图中已有条目,则必须检查每个serverIP。如果有条目,请添加到现有列表中。如果没有条目,则创建一个新列表并将filePath添加到该列表。

if (filesMap.get(serverIP) != null) { 
    List<String> list = new ArrayList<String>(); 
    list.add(filePath); 
    filesMap.put(serverIP, list); 
} else { 
    filesMap.get(serverIP).add(filePath); 
} 

一些变化

List<String> sourceFileList = filesMap.get(serverIP); 
if(sourceFileList == null) { 
    sourceFileList = new ArrayList() ; 
} 
sourceFileList.add(filePath); 
filesMap.put(serverIP, sourceFileList);