[英]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.