插入列表作为值的地图
问题描述:
我得到一个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
得到IPAddress
和FilePath
分开,并投入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 = 3
和List2 = 1
大小,因为我对服务器192.168.1.1
3个文件,只有一个在192.168.1.2
。
我该如何做到这一点???
答
- 你把相同
key
,value
一对地图和指同一个列表这两个键。 - 您可以检查地图包含的关键,如果它存在只是检索值(即列表),并添加
filePath
该名单 - 如果键不存在,则创建新的列表,并添加
filePath
到新创建的列表中,最后加key
,value
映射
试试这个代码
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);