Java 字符串到哈希表

Java 字符串到哈希表,java,string,hashtable,Java,String,Hashtable,我编写了一个简单的程序,读取IpTables日志结果,删除90%的输出,剩下的是: 192.168.1.1 152 192.168.1.1 17485 192.168.1.1 5592 其中,第一列包含源IP,第二列包含一个目标端口。这些值存储在字符串中。我想将值从该字符串传输到哈希表,但我不知道如何传输 Hashtable<String, String> IpDpt = new Hashtable<String, String>(); hmIpDpt

我编写了一个简单的程序,读取IpTables日志结果,删除90%的输出,剩下的是:

192.168.1.1 152
192.168.1.1 17485
192.168.1.1 5592
其中,第一列包含源IP,第二列包含一个目标端口。这些值存储在字符串中。我想将值从该字符串传输到哈希表,但我不知道如何传输

Hashtable<String, String> IpDpt = new Hashtable<String, String>();

        hmIpDpt.put(IP1,DPT1);
        hmIpDpt.put(IP1,DPT2);
        hmIpDpt.put(IP1,DPT3);
        hmIpDpt.put(IP2,DPT4);
Hashtable IpDpt=new Hashtable();
hmIpDpt.put(IP1,DPT1);
hmIpDpt.put(IP1,DPT2);
hmIpDpt.put(IP1,DPT3);
hmIpDpt.put(IP2,DPT4);

如果您转到
哈希表
,您将无法获得所有可用的日志,因为
哈希表
不允许重复值,并且日志中可能存在重复值。因此
hashtable
会覆盖值。

如果转移到
hashtable
则不会有所有可用的日志,因为
hashtable
不允许重复值,并且日志中可能存在重复值。因此
哈希表
覆盖值。

对于您读取的每一行,按如下方式拆分字符串:

    String line = "192.168.1.1 152";
    String[] parts = line.split(" ");
    you_map.put(parts[0], parts[1]);

这样就可以了。

对于您阅读的每一行,按如下方式在空格中拆分字符串:

    String line = "192.168.1.1 152";
    String[] parts = line.split(" ");
    you_map.put(parts[0], parts[1]);

应该这样做。

一个映射不能为每个键保存多个值。因此,您应该使用第三方库,该库提供类似于
MultiMap
,或者使用
Set
来保存值:

Map<String, Set<String>> ipToPortMap = new HashMap<>();

public void addEntry(String ip, String port) {
    Set<String> ports = ipToPortMap.get(ip);
    if (ports == null) {
        ports = new HashSet<>();
        ipToPortMap.put(ip, ports);
    }

    ports.add(port);
}
Map ipToPortMap=newhashmap();
公共无效附加项(字符串ip、字符串端口){
设置端口=ipToPortMap.get(ip);
如果(端口==null){
端口=新的HashSet();
ipToPortMap.put(ip,端口);
}
端口。添加(端口);
}

现在只需迭代输入(可能使用
扫描仪
)并调用
addEntry

贴图不能为每个键保存多个值。因此,您应该使用第三方库,该库提供类似于
MultiMap
,或者使用
Set
来保存值:

Map<String, Set<String>> ipToPortMap = new HashMap<>();

public void addEntry(String ip, String port) {
    Set<String> ports = ipToPortMap.get(ip);
    if (ports == null) {
        ports = new HashSet<>();
        ipToPortMap.put(ip, ports);
    }

    ports.add(port);
}
Map ipToPortMap=newhashmap();
公共无效附加项(字符串ip、字符串端口){
设置端口=ipToPortMap.get(ip);
如果(端口==null){
端口=新的HashSet();
ipToPortMap.put(ip,端口);
}
端口。添加(端口);
}

现在只需重复输入(可能使用
扫描仪
)并调用
addEntry

使用Guava
Multimap
允许重复键

  Multimap<String,String> multimap=ArrayListMultimap.create();

  //put your ips and port.
Multimap Multimap=ArrayListMultimap.create();
//把你的IP和端口。

使用番石榴
多重地图
允许重复密钥

  Multimap<String,String> multimap=ArrayListMultimap.create();

  //put your ips and port.
Multimap Multimap=ArrayListMultimap.create();
//把你的IP和端口。
试试这个程序

String info = "192.168.1.1 152";
    Hashtable<String, List<String>> IpDpt = new Hashtable<String, List<String>>();
    String[] values = info.split( " " );
    String key = values[0];
    String value = values[1];
    if ( IpDpt.containsKey( key ) )
        IpDpt.get( key ).add( value );
    else
        IpDpt.put( key, new ArrayList<String>( Arrays.asList( value ) ) );
试试这个程序

String info = "192.168.1.1 152";
    Hashtable<String, List<String>> IpDpt = new Hashtable<String, List<String>>();
    String[] values = info.split( " " );
    String key = values[0];
    String value = values[1];
    if ( IpDpt.containsKey( key ) )
        IpDpt.get( key ).add( value );
    else
        IpDpt.put( key, new ArrayList<String>( Arrays.asList( value ) ) );

但这不完全是一个答案。请在“注释”部分中添加此作为提示。但这不完全是一个答案。请在“注释”部分中添加此作为提示。请改用哈希映射。哈希表早就不推荐使用了…改用哈希映射。哈希表早就不推荐使用了…但这不允许IP到端口的n:m映射。请注意,同一IP地址可能会出现多次!但这不允许IP到端口的n:m映射。请注意,同一IP地址可能会出现多次!我应该从一个字符串实时读取结果,并决定是否有一个1 IP地址正在检查我机器上的100多个端口。。。所以字符串中的值应该放在hasmap中,我应该检查键是否至少有100个值。您可以额外检查键是否至少有100个值。如果(IpDpt.containsKey(key)&&IpDpt.get(key).size()>100){//business logic here},如果端口号有相同IP地址的重复条目,您也可以将列表替换为Set。像192.168.1.1一样,152项是多次输入的。我应该从字符串实时读取结果,并确定一个1 IP地址是否正在检查我机器上的100多个端口。。。所以字符串中的值应该放在hasmap中,我应该检查键是否至少有100个值。您可以额外检查键是否至少有100个值。如果(IpDpt.containsKey(key)&&IpDpt.get(key).size()>100){//business logic here},如果端口号有相同IP地址的重复条目,您也可以将列表替换为Set。像192.168.1.1一样,152条目是多次的。