2015-05-14 3 views
3

Существует ли конкретный способ проверить, не существует ли IP-адрес в массиве? Прямо сейчас у меня есть arraylist, который состоит из строк IP-адресов (например, «192.168.0.4» и т. Д.). После получения пакета я хотел бы проверить, принадлежит ли IP-адрес пакета в arraylist.Java: проверка наличия IP-адреса в списке массивов

Сначала я думал, что-то вроде этого будет достаточно:

for (int i = 0; i < myList.size(); i++) 
{ 
    if (packet.getAddress().equals(InetAddress.getByName(myList.get(i)))) 
    { 
    System.out.println("this packet's IP address is in list"); 
    } 

    else 
    { 
    System.out.println("this packet's IP address is not in list!"); 
    } 

Я думал, что другое заявление будет решить эту ситуацию, но я был неправ. Любые предложения будут оценены.

+3

Вы ищете ['ArrayList # contains()'] (http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#contains (java.lang.Object))? – TheLostMind

+3

Если вы планируете много искать, используйте вместо этого 'HashSet'. Это значительно ускорит работу, особенно если у вас много IP-адресов. – Glorfindel

+0

Используйте коллекцию, основанную на хеше, для более быстрого поиска. –

ответ

2

Вы должны проверить весь список, прежде чем вы знаете, что IP не существует:

boolean found = false; 
for (int i = 0; i < myList.size() && !found; i++) { 
    if (packet.getAddress().equals(InetAddress.getByName(myList.get(i)))) { 
     found = true; 
     System.out.println("this packet's IP address is in list"); 
    } 
} 
if (!found) { 
    System.out.println("this packet's IP address is not in list!"); 
} 
+2

Почему не просто «ломать», когда ip найден ?. После установки логического флага :) – TheLostMind

+0

@TheLostMind Это тоже будет работать. Но если вы используете break, вам все равно нужен флаг, чтобы узнать, был ли найден IP (если вы не будете полагаться на значение i, которое менее читаемо). – Eran

+0

Я (имел) обновил свой комментарий :) – TheLostMind

1

Проблема заключается в том что вы напечатав сообщение для каждого элемента, который не совпадает с адресом. Вместо этого, вы можете инкапсулировать эту функциональность в способе, возвращают логическое значение, а затем выполнить печать:

public boolean isPackedInList() { 
    for (int i = 0; i < myList.size(); i++) { 
     if (packet.getAddress().equals(InetAddress.getByName(myList.get(i)))) { 
      return true; 
     } 
    } 
    return false; 
} 

, а затем использовать его:

if (isPackedInList()) { 
    System.out.println("this packet's IP address is in list"); 
} else { 
    System.out.println("this packet's IP address is not in list!"); 
} 
4

Я хотел бы предложить, чтобы преобразовать ArrayList в набор (не перед каждой проверкой, поскольку это было бы лишними накладными расходами), таким образом вы можете избежать цикла for. Это просто вопрос

Set<InetAddress> mySet = new HashSet<InetAddress>(myList); 
... 
if(mySet.contains(packet.getAddress())) { 
// ... 
} 

Я думаю, вы также можете использовать myList.contains, но я думаю, что реализация перебирает список в любом случае, так что использование набора будет быстрее.

+0

Я думаю, что это хорошая идея. Всегда хорошо иметь вещи быстрее – WonderfulWonder

Смежные вопросы