用值列表实现Java SortedMap
我想要一个排序后的地图,如下所示: srcAddr、dstAddr、srcPort、dstPort、协议as密钥 以及值的列表 每个钥匙的包装长度、到达时间 可以在单独的类中实现它们吗?我不知道它是否会这样工作 更新: 我收到一个错误,指示我没有重写抽象方法compareTo()。你能帮我吗用值列表实现Java SortedMap,java,Java,我想要一个排序后的地图,如下所示: srcAddr、dstAddr、srcPort、dstPort、协议as密钥 以及值的列表 每个钥匙的包装长度、到达时间 可以在单独的类中实现它们吗?我不知道它是否会这样工作 更新: 我收到一个错误,指示我没有重写抽象方法compareTo()。你能帮我吗 package myclassifier; import java.io.Serializable; import java.util.*; public class Flows implements S
package myclassifier;
import java.io.Serializable;
import java.util.*;
public class Flows implements Serializable, Comparable {
String srcAddr, dstAddr, srcPort, dstPort, protocol;
public int compareTo(Flows other) {
int res = this.srcAddr.compareTo(other.srcAddr);
if (res != 0) {
return res;
}
res = this.dstAddr.compareTo(other.dstAddr);
if (res != 0) {
return res;
}
res = this.srcPort.compareTo(other.srcPort);
if (res != 0) {
return res;
}
res = this.dstPort.compareTo(other.dstPort);
if (res != 0) {
return res;
}
return this.protocol.compareTo(other.protocol);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((dstAddr == null) ? 0 : dstAddr.hashCode());
result = prime * result + ((dstPort == null) ? 0 : dstPort.hashCode());
result = prime * result + ((srcAddr == null) ? 0 : srcAddr.hashCode());
result = prime * result + ((srcPort == null) ? 0 : srcPort.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Flows other = (Flows) obj;
if (dstAddr == null) {
if (other.dstAddr != null)
return false;
} else if (!dstAddr.equals(other.dstAddr))
return false;
if (dstPort == null) {
if (other.dstPort != null)
return false;
} else if (!dstPort.equals(other.dstPort))
return false;
if (srcAddr == null) {
if (other.srcAddr != null)
return false;
} else if (!srcAddr.equals(other.srcAddr))
return false;
if (srcPort == null) {
if (other.srcPort != null)
return false;
} else if (!srcPort.equals(other.srcPort))
return false;
return true;
}
}
是否要根据地图的键或值对地图进行排序?您想按字母顺序还是按上面指定的顺序对键进行排序?总的来说,这应该不会太难:
SorterMap<String, List> mySortedMap = new TreeMap<String, List>(myComparator);
mySortedMap.put("srcAddr", Arrays.asList(new Object[] {packetLengthValue, arrivalTimeValue}))
SorterMap mySortedMap=newtreemap(myComparator);
mySortedMap.put(“srcAddr”,Arrays.asList(新对象[]{packetLengthValue,arrivalTimeValue}))
您应该在何处实施myComparator来根据您的要求对键进行排序。您想根据地图的键或值对地图进行排序?您想按字母顺序还是按上面指定的顺序对键进行排序?总的来说,这应该不会太难:
SorterMap<String, List> mySortedMap = new TreeMap<String, List>(myComparator);
mySortedMap.put("srcAddr", Arrays.asList(new Object[] {packetLengthValue, arrivalTimeValue}))
SorterMap mySortedMap=newtreemap(myComparator);
mySortedMap.put(“srcAddr”,Arrays.asList(新对象[]{packetLengthValue,arrivalTimeValue}))
您应该在其中实现myComparator,以便根据您的要求对密钥进行排序。您可以编写一个,比如说一个“MyKey”类,将srcadr、dstAddr、srcPort、dstPort和protocol作为其成员变量。您必须小心地重写此类的
equals
和hashCode
方法。此类还必须实现接口,以指示如何根据成员字段确定订单
您可以实现一个类MyValue,将packetLength、timeArrival等作为成员。这将是要存储在地图中的值
用于根据MyKey存储MyValue。您可以编写一个,比如说一个“MyKey”类,该类的成员变量为srcadr、dstAddr、srcPort、dstPort和protocol。您必须小心地重写此类的
equals
和hashCode
方法。此类还必须实现接口,以指示如何根据成员字段确定订单
您可以实现一个类MyValue,将packetLength、timeArrival等作为成员。这将是要存储在地图中的值
用于根据MyKey存储MyValue。您可以为该键实现不同的类
public class Packet implements Serializable, Comparable {
String srcAddr, dstAddr, srcPort, dstPort;
public int compareTo(Object arg0) {
// your sorting logic here
return ...;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((dstAddr == null) ? 0 : dstAddr.hashCode());
result = prime * result + ((dstPort == null) ? 0 : dstPort.hashCode());
result = prime * result + ((srcAddr == null) ? 0 : srcAddr.hashCode());
result = prime * result + ((srcPort == null) ? 0 : srcPort.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Packet other = (Packet) obj;
if (dstAddr == null) {
if (other.dstAddr != null)
return false;
} else if (!dstAddr.equals(other.dstAddr))
return false;
if (dstPort == null) {
if (other.dstPort != null)
return false;
} else if (!dstPort.equals(other.dstPort))
return false;
if (srcAddr == null) {
if (other.srcAddr != null)
return false;
} else if (!srcAddr.equals(other.srcAddr))
return false;
if (srcPort == null) {
if (other.srcPort != null)
return false;
} else if (!srcPort.equals(other.srcPort))
return false;
return true;
}
}
一个是数据
public class Payload {
Integer packetLength;
Date timeArrival;
}
然后,当您将带有某个键的有效负载放入已排序的映射中时,它将根据compareTo方法按顺序放置您可以为该键实现不同的类
public class Packet implements Serializable, Comparable {
String srcAddr, dstAddr, srcPort, dstPort;
public int compareTo(Object arg0) {
// your sorting logic here
return ...;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((dstAddr == null) ? 0 : dstAddr.hashCode());
result = prime * result + ((dstPort == null) ? 0 : dstPort.hashCode());
result = prime * result + ((srcAddr == null) ? 0 : srcAddr.hashCode());
result = prime * result + ((srcPort == null) ? 0 : srcPort.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Packet other = (Packet) obj;
if (dstAddr == null) {
if (other.dstAddr != null)
return false;
} else if (!dstAddr.equals(other.dstAddr))
return false;
if (dstPort == null) {
if (other.dstPort != null)
return false;
} else if (!dstPort.equals(other.dstPort))
return false;
if (srcAddr == null) {
if (other.srcAddr != null)
return false;
} else if (!srcAddr.equals(other.srcAddr))
return false;
if (srcPort == null) {
if (other.srcPort != null)
return false;
} else if (!srcPort.equals(other.srcPort))
return false;
return true;
}
}
一个是数据
public class Payload {
Integer packetLength;
Date timeArrival;
}
然后,当您将带有某个键的有效负载放入排序映射时,它将根据compareTo方法按顺序放置我需要将所有5元组作为我的键srcAddr、dstAddr、srcPort、dstPort和protocol。并按照我写下它们的方式进行排序。我需要将所有5元组作为我的键srcAddr、dstAddr、srcPort、,DSport和protocol.并按照我写下来的方式分类。我想我不清楚。我首先查找TCPFlows,然后查找该流中每个数据包的特征。流被定义为特定源地址和目标地址之间的一组数据包。我想做的是,例如:srcAddr=x dstAddr=y srcPort=dstPort=80 protocol=http如果已经不存在包含这些信息的记录,我将把它添加到我的表中,然后写一些关于属于该流的数据包的静态信息,依此类推。它可能是属于一个流的16个数据包,以此类推。所以我以为流中每个包都有一个列表,我想我不清楚。我首先查找TCPFlows,然后查找该流中每个数据包的特征。流被定义为特定源地址和目标地址之间的一组数据包。我想做的是,例如:srcAddr=x dstAddr=y srcPort=dstPort=80 protocol=http如果已经不存在包含这些信息的记录,我将把它添加到我的表中,然后写一些关于属于该流的数据包的静态信息,依此类推。它可能是属于一个流的16个数据包,以此类推。所以我想的是在flow.public int compareTo(Flows arg0){if(this.srcadr==arg0.srcadr&&this.dstAddr==arg0.dstAddr&&this.srcPort==arg0.srcPort&&this.dstPort==arg0.dstPort&&this.protocol==arg0.protocol)返回0;是否正确?返回部分有问题。首先让我知道您希望如何订购MyKey对象,然后我可以帮助您实现此方法。例如,如果有两个MyKey对象,请告诉我您将应用的业务逻辑,以确定哪个对象是第一个对象,哪个是第二个对象。我我在pcap文件中查找流。流是一组数据包,所有数据包都具有相同的5元组:srcAddr、dstAddr、srcPort、dstPort、protocol。然后我想检查每个数据包是否属于流,如果属于流,我将为每个数据包提取一些静态数据。我考虑的是字段的顺序,而不是对象的顺序。可能是我错了,我不知道如果我做得对,那么首先确定您的需求:)public int compareTo(Flows arg0){if(this.srcadr==arg0.srcadr&&this.dstAddr==arg0.dstAddr&&this.srcPort==arg0.srcPort&&this.dstPort==arg0.dstPort&&this.protocol==arg0.protocol)返回0;是否正确?返回部分有问题。首先让我知道您希望如何订购MyKey对象,然后我可以帮助您实现此方法。例如,如果有两个MyKey对象,请告诉我您的