我有一个hashMap。每个“值”将成为一个列表,稍后将使用我的“密钥”进行映射。希望列表如下所示:
[长度,时间] [长度,时间] [长度,时间]
例如: 键{srcAddr = x,dstAddr = y,srcPort = 12345,dstPort = 80} 值{(6523,0.001),(124,0.05),(),(),...}
我只是想知道如何才能拥有双列数组列表。
package myclassifier;
import java.util.ArrayList;
public class FlowStatics {
int packetLength;
double timeArrival;
public FlowStatics(int pLength, double tArrival)
{
this.packetLength = pLength;
this.timeArrival = tArrival;
}
} 以下是我如何使用它:
final ArrayList<FlowStatics> staticsArray = new ArrayList<FlowStatics>();
final HashMap<Flows, ArrayList> myHashMap = new HashMap<Flows, ArrayList>();
FlowStatics flowStatics = new FlowStatics(packetLength,timeArrival);
staticsArray.add(flowStatics);
myHashMap.put(flows, staticsArray);
以下是我正在阅读的部分:
Iterator<Flows> iterator = myHashMap.keySet().iterator();
while(iterator.hasNext()){
Flows key = iterator.next();
ArrayList value = myHashMap.get(key);
System.out.println("Fows"+key+"----------"+"Statics"+ value);
答案 0 :(得分:4)
嗯,您的FlowStatics
是正确的解决方案
List<FlowStatics>
将为您提供“双列数组列表”。
更新:从您的更新开始,myHashMap.put(flows, flowStatics);
错误。你这是一个单独的对,而不是地图中的列表。你应该使用:
staticsArray.add(flowStatics);
myHashMap.put(flows, staticsArray);
答案 1 :(得分:3)
List<E>
是类型为E
的同类元素列表的抽象。有一些限制(例如没有原语),但从概念上讲,类型E
可以定义为你想要的任何内容。
假设有Pair<L,R>
的抽象。然后,List<Pair<L,R>>
仍然是某些E
的列表,但现在E
是Pair<L,R>
。所以它仍然是一个“单列”列表,但列表中的每个元素都是“对”,所以它就是一个“两列”列表。
请注意,您并不总是需要通用Pair<L,R>
。正确封装所有信息的任何类型E
都可以在List<E>
中使用。
顺便说一下,你也可以List<List<E>>
。
人们经常会问“如何在Java中返回两个值?”。答案是类似的。您返回一个值,一个封装了这两个信息的新类型。
所以而不是:
// attempt to return two values
// DOES NOT COMPILE
return "James Bond";
return "007";
你这样做:
return new SecretAgent("James Bond", "007");