用值列表实现Java SortedMap

用值列表实现Java SortedMap,java,Java,我想要一个排序后的地图,如下所示: srcAddr、dstAddr、srcPort、dstPort、协议as密钥 以及值的列表 每个钥匙的包装长度、到达时间 可以在单独的类中实现它们吗?我不知道它是否会这样工作 更新: 我收到一个错误,指示我没有重写抽象方法compareTo()。你能帮我吗 package myclassifier; import java.io.Serializable; import java.util.*; public class Flows implements S

我想要一个排序后的地图,如下所示:

srcAddr、dstAddr、srcPort、dstPort、协议as密钥

以及值的列表

每个钥匙的包装长度、到达时间

可以在单独的类中实现它们吗?我不知道它是否会这样工作

更新: 我收到一个错误,指示我没有重写抽象方法compareTo()。你能帮我吗

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对象,请告诉我您的