根据单词拆分ArrayList

时间:2018-11-02 15:57:44

标签: java arraylist

尝试(但失败)基于“起始词”拆分ArrayList。

ArrayList是套接字的集合,最初是HashSet-

[[Socket[addr=/192.168.150.210,port=2001,localport=49671], Socket[addr=/192.168.150.211,port=2001,localport=49670], Socket[addr=/192.168.150.215,port=2001,localport=49672], Socket[addr=/192.168.150.213,port=10001,localport=49669]]]

需要以某种方式拆分该数组,所以我得到一个新的ArrayList,该数组包含不同的元素(每个元素都以Socket [等开头,因此我可以根据大小循环访问)以寻找匹配的IP地址。

即(作为4个“记录”)

Socket[addr=/192.168.150.210,port=2001,localport=49671]
Socket[addr=/192.168.150.211,port=2001,localport=49670]
Socket[addr=/192.168.150.215,port=2001,localport=49672]
Socket[addr=/192.168.150.213,port=10001,localport=49669]

我不能在原始ArrayList上使用i =,因为它的大小为1条记录(需要4条记录)

Object currentSock = null; 

for (int i =0; i<  theseSocks.size(); i++)
{
currentSock = theseSocks.get(i);
if (currentSock.toString().contains(ipAddress))
{
System.out.println(" the ArrayList element is " +currentSock);
break;
}
}

表示赞赏(我是新手)。 问候 拉尔夫

1 个答案:

答案 0 :(得分:0)

通常,最好不要通过生成代表整个对象的字符串来进行过滤或查找。而是根据感兴趣的属性(在您的情况下为IP地址)进行匹配。

在Java 8和更高版本中,有一个称为流的功能可以使此操作非常快速。

在这种情况下,我仍然使用inetAddress toString来对IP进行字符串匹配,但没有在整个对象上调用toString。

兴趣线如下:

Optional< Socket > matchingSocket = sockets.stream().findAny().filter( socket -> socket.getInetAddress().toString().equals( "/192.168.0.1" ) );

下面是一个可运行的示例。您需要目标实际连接,否则您将陷入异常处理之中。因此,您需要找到愿意接受端口上的连接的计算机,并相应地更改添加行,或使用实时HashSet。

try
{
    List< Socket > sockets = Lists.newArrayList( );
    sockets.add( new Socket( "192.168.0.1", 7777 ) );
    sockets.add( new Socket( "192.168.0.2", 7777 ) );

    Optional< Socket > matchingSocket = sockets.stream().findAny().filter( socket -> socket.getInetAddress().toString().equals( "/192.168.0.1" ) );

}
catch( Exception e )
{
    //handle this
}

以下是使用for循环而不是流的示例:

try
{
    List< Socket > sockets = Lists.newArrayList( );
    sockets.add( new Socket( "192.168.0.1", 7777 ) );
    sockets.add( new Socket( "192.168.0.2", 7777 ) );

    for( Socket socket : sockets)
    {
        if( socket.getInetAddress().toString().equals( "/192.168.0.1" ) )
            System.out.println( "Found socket " + socket.toString() );
    }

}
catch( Exception e )
{
    //handle this
}

同样值得注意的是,此for循环可与HashSet一起使用。我想知道您的ArrayList是否包含某种形式的HashSet而不是单个套接字。您可以只迭代HashSet。

用以下内容替换我的arraylist行以进行测试:

Set< Socket > sockets = Sets.newHashSet( );
sockets.add( new Socket( "192.168.0.1", 7777 ) );
sockets.add( new Socket( "192.168.0.2", 7777 ) );