簡體   English   中英

根據單詞拆分ArrayList

[英]Split ArrayList based on word

嘗試(但失敗)基於“起始詞”拆分 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 上使用 for i = 因為它的大小是 1 條記錄(需要 4 條記錄)

IE

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;
}
}

想法表示贊賞(我是新手)。 問候拉爾夫

通常,最好不要通過生成表示整個對象的字符串來過濾或查找。 而是基於感興趣的屬性進行匹配,在您的情況下是 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 ) );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM