Як визначити, чи містить масив певне значення в Java?


2275

У мене є String[]такі значення:

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

Враховуючи String s, чи є хороший спосіб тестування, чи VALUESмістить він s?


5
Довгий шлях навколо нього, але ви можете використовувати цикл for: "for (String s: VALUES) if (s.equals (" MYVALUE ")) return true;
Zack

70
@camickr. На ваше запитання я підтримав це запитання і вашу відповідь-знаю, тому що це врятувало мені 30 хвилин і 20 рядків коду, які некрасиво писали для циклів, -now-. Не читав її три роки тому. (BTW, дякую :))
Переслідування

3
@ camickr - У мене майже однакова ситуація з цією: stackoverflow.com/a/223929/12943 Він просто продовжує отримувати голоси, це була лише копія / вставка документації від сонця. Я думаю, оцінка базується на тому, скільки допомоги ви надали, а не скільки зусиль ви доклали до неї - і, головним чином, як швидко ви її розміщуєте! Можливо, ми натрапили на секрет Джона Скіта! Добре відповідь, +1 для вас.
Білл К

1
Якщо ви використовуєте Apache Commons, то org.apache.commons.lang.ArrayUtils.contains () робить це за вас.
Пан Хлопчик

34
@camickr, тому що такі, як я, гуглить питання, натискають на результат SO, бачать вашу відповідь, перевіряють її, вона працює, підтверджує відповідь і потім залишає.
Aequitas

Відповіді:


2920
Arrays.asList(yourArray).contains(yourValue)

Попередження: це не працює для масивів примітивів (див. Коментарі).


З тих пір тепер ви можете використовувати Streams.

String[] values = {"AB","BC","CD","AE"};
boolean contains = Arrays.stream(values).anyMatch("s"::equals);

Щоб перевірити масив чи int, doubleабо longмістить використання значень IntStream, DoubleStreamабо LongStreamвідповідно.

Приклад

int[] a = {1,2,3,4};
boolean contains = IntStream.of(a).anyMatch(x -> x == 4);

87
Мені дещо цікаво про ефективність цього порівняно з пошуковими функціями класу Arrays порівняно з повторенням масиву та використанням функції equals () або == для примітивів.
Томас Оуенс

186
Ви не втрачаєте багато, оскільки asList () повертає ArrayList, який має масив в основі. Конструктор просто змінить посилання, так що там не буде багато роботи. І містить () / indexOf () буде повторювати та використовувати equals (). Для примітивів вам краще краще кодувати це самостійно. Для рядків або інших класів різниця не буде помітна.
Joey

18
Як не дивно, NetBeans стверджує, що 'Arrays.asList (святкові дні)' для 'int [] канікул' повертає 'список <int []>', а не 'список <int>'. Він просто містить один єдиний елемент. Значення Містить не працює, оскільки у нього є лише один елемент; масив int.
Nyerguds

62
Nyerguds: справді це не працює для примітивів. У Java примітивні типи не можуть бути родовими. asList оголошено як <T> Список <T> якList (T ...). Коли ви передаєте в нього int [], компілятор виводить T = int [], оскільки він не може зробити висновок T = int, тому що примітиви не можуть бути загальними.
CromTheDestroyer

28
@Joey просто примітка боку, що це ArrayList, але не java.util.ArrayListтак , як очікувалося, реальний клас повертається: java.util.Arrays.ArrayList<E>визначається як: public class java.util.Arrays {private static class ArrayList<E> ... {}}.
TWiStErRob

362

Коротке оновлення Java SE 9

Референтні масиви погані. У цьому випадку ми після набору. З Java SE 9 у нас є Set.of.

private static final Set<String> VALUES = Set.of(
    "AB","BC","CD","AE"
);

"Дано String s, чи є хороший спосіб перевірити, чи містить VALUES s?"

VALUES.contains(s)

O (1).

Правильний тип , незмінний , O (1) і короткий . Гарний.*

Оригінальні дані відповіді

Просто для очищення коду для початку. Ми (виправили):

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

Це змінна статика, про яку FindBugs скаже вам, дуже неслухняна. Не змінюйте статику і не дозволяйте іншому коду також робити це. За абсолютного мінімуму поле має бути приватним:

private static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

(Зверніть увагу, ви можете фактично скинути new String[];шматочок.)

Довідкові масиви все ще погані, і ми хочемо набір:

private static final Set<String> VALUES = new HashSet<String>(Arrays.asList(
     new String[] {"AB","BC","CD","AE"}
));

(Параноїдні люди, такі як я, можуть почувати себе більш спокійно, якби це було обгорнуто Collections.unmodifiableSet- це може бути навіть оприлюднено.)

(* Щоб бути трохи більше про бренд, API колекцій передбачувано все ще не вистачає незмінних типів колекцій, і синтаксис, на мій смак, все ще надто багатослівний.)


184
За винятком O (N), щоб створити колекцію в першу чергу :)
Drew Noakes

60
Якщо він статичний, він, ймовірно, буде використовуватися досить багато разів. Отже, час, витрачений на ініціалізацію набору, має великі шанси бути досить малим порівняно з вартістю багатьох лінійних пошуків.
Xr.

1
Після створення колекції буде домінувати час завантаження коду (який технічно O (n), але практично постійний).
Том Хотін - тайклін

2
@ TomHawtin-tackline Чому ви говорите "зокрема, тут ми хочемо набір"? Яка перевага набору (HashSet) в цьому випадку? Чому "опорний масив" поганий (під "контрольним масивом" ви маєте на увазі ArrayList, підтримуваний масивом, згенерований викликом до Arrays.asList)?
Василь Бурк

6
@nmr A TreeSetбуло б O(log n). HashSets масштабуються таким чином, що середня кількість елементів у відрі є приблизно постійною. Принаймні для масивів до 2 ^ 30. Можуть впливати, скажімо, апаратні кеші, які аналіз big-O ігнорує. Також передбачає, що хеш-функція працює ефективно.
Том Хоутін - тайклін

206

Ви можете використовувати ArrayUtils.containsз Apache Commons Lang

public static boolean contains(Object[] array, Object objectToFind)

Зауважте, що цей метод повертається, falseякщо переданий масив є null.

Існують також методи для примітивних масивів усіх видів.

Приклад:

String[] fieldsToInclude = { "id", "name", "location" };

if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
    // Do some stuff.
}

4
@ max4 все, що я погоджуюсь, але це все-таки краще, ніж "прокат свого" і легше читати, а потім сирий Java-спосіб.
Джейсон


38
@ max4ever Іноді у вас вже є бібліотека (з інших причин), і це абсолютно правильна відповідь. Я шукав це, і вже залежу від Apache Commons Lang. Дякую за цю відповідь.
GuiSim

1
Або ви можете просто скопіювати метод (і залежність, якщо такі є).
Буффало

10
@ max4ever Більшість додатків для Android мінімізуються програмою Proguard, додаючи у ваш додаток лише потрібні класи та функції. Це робить рівним прокручування вашого власного власного копіювання або копіювання джерела апаші. А хто не використовує цю мінімізацію, не потрібно скаржитися на 700 кбіт або
78 кб

158

Просто реалізуйте це вручну:

public static <T> boolean contains(final T[] array, final T v) {
    for (final T e : array)
        if (e == v || v != null && v.equals(e))
            return true;

    return false;
}

Вдосконалення:

v != nullУмова є постійним всередині методу. Він завжди оцінює однакове булеве значення під час виклику методу. Отже, якщо вхід arrayвеликий, то ефективніше оцінити цю умову лише один раз, і ми можемо використовувати спрощений / швидший стан всередині forциклу на основі результату. Удосконалений contains()метод:

public static <T> boolean contains2(final T[] array, final T v) {
    if (v == null) {
        for (final T e : array)
            if (e == null)
                return true;
    } 
    else {
        for (final T e : array)
            if (e == v || v.equals(e))
                return true;
    }

    return false;
}

9
@Phoexo Це рішення, очевидно, швидше, тому що прийнята відповідь перетворює масив у список і викликає метод містить () у цьому списку, в той час як моє рішення в основному робить те, що містить () тільки зробить.
icza

10
@AlastorMoody e == v робить перевірку рівності еталонів, що дуже швидко. Якщо той самий об’єкт (той самий за посиланням) знаходиться в масиві, його знайдуть швидше. Якщо це не той самий екземпляр, він все одно може бути таким же, як заявлений методом equals (), це те, що перевіряється, якщо посилання не однакові.
icza

20
Чому ця функція не є частиною Java? Недарма люди кажуть, що Java роздута ... подивіться на всі відповіді вище цього, у яких використовується купа бібліотек, коли все, що вам потрібно, - це цикл. Діти в ці дні!
фрікхед

4
@phreakhead Це частина Java, дивітьсяCollection.contains(Object)
Стів Куо

11
@icza Якщо ви подивитесь на джерело, Arraysі ArrayListвиявиться, що це не обов'язково швидше, ніж використовувана версія Arrays.asList(...).contains(...). Накладні витрати на створення ArrayListнадзвичайно малі, і він ArrayList.contains()використовує розумніший цикл (він фактично використовує дві різні петлі), ніж показаний вище (JDK 7).
Аксель

72

Чотири різні способи перевірити, чи містить масив значення

1) Використання списку:

public static boolean useList(String[] arr, String targetValue) {
    return Arrays.asList(arr).contains(targetValue);
}

2) Використання набору:

public static boolean useSet(String[] arr, String targetValue) {
    Set<String> set = new HashSet<String>(Arrays.asList(arr));
    return set.contains(targetValue);
}

3) Використання простого циклу:

public static boolean useLoop(String[] arr, String targetValue) {
    for (String s: arr) {
        if (s.equals(targetValue))
            return true;
    }
    return false;
}

4) Використання Arrays.binarySearch ():

Нижче наведений код невірний, він вказаний тут для повноти. binarySearch () можна ТОЛЬКО використовувати на відсортованих масивах. Ви побачите результат дивний нижче. Це найкращий варіант при сортуванні масиву.

public static boolean binarySearch(String[] arr, String targetValue) {  
            int a = Arrays.binarySearch(arr, targetValue);
            return a > 0;
        }

Короткий приклад:

String testValue="test";
String newValueNotInList="newValue";
String[] valueArray = { "this", "is", "java" , "test" };
Arrays.asList(valueArray).contains(testValue); // returns true
Arrays.asList(valueArray).contains(newValueNotInList); // returns false

5
ваш приклад бінарного пошуку повинен повертати a> 0;
Буде Шервуд

6
Чому? Я думаю, що він повинен повернути a> -1, оскільки 0 означатиме, що він міститься на чолі масиву.
mbelow

1
Перший варіант з (a >= 0)був правильним, просто перевірте документи , вони говорять: "Зверніть увагу, що це гарантує, що повернене значення буде> = 0, якщо і тільки якщо ключ знайдений".
Yoory N.

Чому працює String, а не int? існує статичний булевий (int [] ints, int k) {return Arrays.asList (ints) .contains (k); }
Вілліанс Мартінс

71

Якщо масив не відсортований, вам доведеться повторити все та здійснити виклик рівним для кожного.

Якщо масив відсортований, ви можете виконати двійковий пошук, у класі Arrays є такий .

Взагалі кажучи, якщо ви збираєтеся робити багато перевірок членства, можливо, ви захочете зберігати все у наборі, а не в масиві.


1
Крім того, як я вже сказав у своїй відповіді, якщо ви використовуєте клас Arrays, ви можете сортувати масив, а потім виконати двійковий пошук за нещодавно відсортованим масивом.
Томас Оуенс

1
@Thomas: Я згоден. Або ви можете просто додати все до TreeSet; однакова складність. Я б використовував масиви, якщо він не змінюється (можливо, заощаджує трохи місця пам'яті, оскільки посилання розташовані безперервно, хоча рядки не є). Я б використав набір, якщо це зміниться з часом.
Урі

49

Для чого це варто, я провів тест, порівнюючи 3 пропозиції щодо швидкості. Я генерував випадкові цілі числа, перетворив їх у String і додав їх у масив. Потім я шукав максимально можливе число / рядок, який був би найгіршим сценарієм для asList().contains().

При використанні 10K розміру масиву результати були:

Сортування та пошук: 15
Двійковий пошук: 0
asList.міст: 0

При використанні масиву 100K результати були:

Сортування та пошук: 156
Двійковий пошук: 0
asList.міст: 32

Отже, якщо масив створений у відсортованому порядку, двійковий пошук є найшвидшим, інакше це asList().containsбув би шлях. Якщо у вас є багато пошукових запитів, можливо, варто відсортувати масив, щоб ви могли використовувати двійковий пошук. Все залежить від вашої заявки.

Я думаю, що це результати, які більшість людей очікує. Ось код тесту:

import java.util.*;

public class Test
{
    public static void main(String args[])
    {
        long start = 0;
        int size = 100000;
        String[] strings = new String[size];
        Random random = new Random();


        for (int i = 0; i < size; i++)
            strings[i] = "" + random.nextInt( size );

        start = System.currentTimeMillis();
        Arrays.sort(strings);
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Sort & Search : " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Search        : " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.asList(strings).contains( "" + (size - 1) ));
        System.out.println("Contains      : " + (System.currentTimeMillis() - start));
    }
}

6
Я не розумію цього коду. Ви сортуєте масив 'рядки' і використовуєте той самий (відсортований) масив в обох викликах до binarySearch. Як це може показати що-небудь, крім оптимізації виконання HotSpot? Те саме з викликом asList.contains. Ви створюєте список із відсортованого масиву, а потім він містить на ньому найвище значення. Звичайно, це займе час. У чому сенс цього тесту? Не кажучи вже про неправильно написаний мікро-позначку
Ерік

Крім того, оскільки двійковий пошук може застосовуватися лише до відсортованого набору, сортування та пошук - це єдиний можливий спосіб використання двійкового пошуку.
Ерік

Сортування може бути вже здійснено з ряду інших причин, наприклад, його можна сортувати за init і ніколи не змінювати. Використовується для тестування часу пошуку самостійно. Однак, коли це знижується, це є менш ніж зоряним прикладом мікробензорування. Мікробензинові знаки, як відомо, важко дістати право на Java, і, наприклад, повинні включати виконання тестового коду, достатнього для оптимізації точки доступу перед запуском фактичного тесту, не кажучи вже про те, щоб запустити фактичний код тесту більше, ніж ONCE з таймером. Приклад підводних каменів
Thor84no

7
Цей тест є помилковим, оскільки він виконує всі 3 тести в одному екземплярі JVM. Пізніші тести можуть отримати користь від попередніх, які прогрівають кеш, JIT тощо
Стів Куо,

4
Цей тест насправді абсолютно не пов'язаний. Сортування та пошук лінійно-складний (n * log (n)) складності, двійковий пошук - логарифмічний, а ArrayUtils.contains - очевидно, лінійний. Немає сенсу порівнювати ці рішення, оскільки вони є в абсолютно різних класах складності.
dragn

37

Замість того, щоб використовувати синтаксис швидкого масиву ініціалізації, ви можете просто ініціалізувати його як список безпосередньо аналогічним чином, використовуючи метод Arrays.asList, наприклад:

public static final List<String> STRINGS = Arrays.asList("firstString", "secondString" ...., "lastString");

Тоді ви можете зробити (як вище):

STRINGS.contains("the string you want to find");

35

За допомогою Java 8 ви можете створити потік і перевірити, чи відповідають будь-які записи у потоці "s":

String[] values = {"AB","BC","CD","AE"};
boolean sInArray = Arrays.stream(values).anyMatch("s"::equals);

Або як загальний метод:

public static <T> boolean arrayContains(T[] array, T value) {
    return Arrays.stream(array).anyMatch(value::equals);
}

3
Варто також відзначити примітивні спеціалізації.
skiwi

Крім того, anyMatchJavaDoc заявляє, що це "...May not evaluate the predicate on all elements if not necessary for determining the result.", тому, можливо, не знадобиться продовжувати обробку після пошуку відповідності.
mkobit

28

Клас Arrays можна використовувати для здійснення двійкового пошуку значення. Якщо ваш масив не відсортований, вам доведеться використовувати функції сортування в одному класі для сортування масиву, а потім здійснювати пошук по ньому.


Ви можете використовувати функції сортування в одному класі для досягнення цього ... Я повинен додати це до своєї відповіді.
Томас Оуенс

1
Можливо, це буде коштувати дорожче, ніж підхід asList (). Містить (), то, я думаю. Якщо вам не потрібно робити це перевіряти дуже часто (але якщо це просто статичний список значень, який можна відсортувати для початку, щоб бути справедливим).
Джої

Правда. Існує маса змінних, які були б найбільш ефективними. Хоча є варіанти.
Томас Оуенс

Деякий код , який робить це тут: stackoverflow.com/a/48242328/9131078
OOBalance

Сортування цілого масиву за метою пошуку дорого. Ми можемо використовувати той самий час процесора для самого пошуку лайнера. Я віддаю перевагу двійковому пошуку на колекції, яка вже заздалегідь побудована в упорядкованому порядку.
arunwithasmile

17

ObStupidAnswer (але я думаю, що тут десь є урок):

enum Values {
    AB, BC, CD, AE
}

try {
    Values.valueOf(s);
    return true;
} catch (IllegalArgumentException exc) {
    return false;
}

1
Кидання винятків, очевидно, важке, але це був би новий спосіб перевірки значення, якщо воно працює. Недоліком є ​​те, що перерахунок повинен бути визначений заздалегідь.
Джеймс П.

13

Насправді, якщо ви використовуєте HashSet <String> в якості запропонованого Томом Хоутіном, вам не потрібно турбуватися про сортування, і ваша швидкість така ж, як і при двійковому пошуку за зв'язаним масивом, можливо, навіть швидше.

Все залежить від того, як налаштований ваш код, очевидно, але від того, де я стою, порядок буде таким:

На несортованому масиві:

  1. HashSet
  2. якСписок
  3. сортувати & двійкові

На відсортованому масиві:

  1. HashSet
  2. Двійкові
  3. якСписок

Так що в будь-якому випадку, HashSet на виграш.


2
Членство в HashSet має бути O (1), а двійковий пошук у відсортованій колекції - O (log n).
Skylar Saveland

11

Якщо у вас є бібліотека колекцій google, відповідь Тома можна значно спростити за допомогою ImmutableSet (http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html)

Це дійсно знімає безліч неприємностей від запропонованої ініціалізації

private static final Set<String> VALUES =  ImmutableSet.of("AB","BC","CD","AE");

10

Одне можливе рішення:

import java.util.Arrays;
import java.util.List;

public class ArrayContainsElement {
  public static final List<String> VALUES = Arrays.asList("AB", "BC", "CD", "AE");

  public static void main(String args[]) {

      if (VALUES.contains("AB")) {
          System.out.println("Contains");
      } else {
          System.out.println("Not contains");
      }
  }
}

8

Розробники часто роблять:

Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);

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

Arrays.asList(arr).contains(targetValue);

або

   for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }

return false;

Перший читає, ніж другий.


7

Використання простого циклу - це найефективніший спосіб зробити це.

boolean useLoop(String[] arr, String targetValue) {
    for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }
    return false;
}

Люб’язно надано Programcreek


Це призведе до виключення нульового покажчика, якщо масив містить нульове посилання перед цільовим значенням.
Семюель Едвін Уорд

1
оператор if повинен бути: if (targetValue.equals (s)), тому що String equals має перевірку instanceof.
Архонт

використовуйте Objects.equals (obj1, obj2) замість того, щоб бути безпечним для нуля.
трилогія


5
  1. Для масивів обмеженої довжини використовуйте наступне (за даними camickr ). Це повільно для повторних перевірок, особливо для довших масивів (лінійний пошук).

     Arrays.asList(...).contains(...)
  2. Для швидкої продуктивності, якщо ви неодноразово перевіряєте наявність більшого набору елементів

    • Масив - неправильна структура. Використовуйте a TreeSetі додайте до нього кожен елемент. Він сортує елементи та має швидкий exist()метод (двійковий пошук).

    • Якщо елементи реалізують Comparable& ви хочете TreeSetвідсортувати відповідно:

      ElementClass.compareTo()метод повинен бути порівнянним з ElementClass.equals(): див. Тріади, не показані для боротьби? (У наборі Java відсутній елемент)

      TreeSet myElements = new TreeSet();
      
      // Do this for each element (implementing *Comparable*)
      myElements.add(nextElement);
      
      // *Alternatively*, if an array is forceably provided from other code:
      myElements.addAll(Arrays.asList(myArray));
    • В іншому випадку використовуйте своє Comparator:

      class MyComparator implements Comparator<ElementClass> {
           int compareTo(ElementClass element1; ElementClass element2) {
                // Your comparison of elements
                // Should be consistent with object equality
           }
      
           boolean equals(Object otherComparator) {
                // Your equality of comparators
           }
      }
      
      
      // construct TreeSet with the comparator
      TreeSet myElements = new TreeSet(new MyComparator());
      
      // Do this for each element (implementing *Comparable*)
      myElements.add(nextElement);
    • Виплата: перевірити наявність якогось елемента:

      // Fast binary search through sorted elements (performance ~ log(size)):
      boolean containsElement = myElements.exists(someElement);

4
Навіщо турбуватися TreeSet? HashSetшвидше (O (1)) і не вимагає замовлення.
Шон Оуен

4

Спробуйте це:

ArrayList<Integer> arrlist = new ArrayList<Integer>(8);

// use add() method to add elements in the list
arrlist.add(20);
arrlist.add(25);
arrlist.add(10);
arrlist.add(15);

boolean retval = arrlist.contains(10);
if (retval == true) {
    System.out.println("10 is contained in the list");
}
else {
    System.out.println("10 is not contained in the list");
}

4

Використовуйте наступне ( contains()метод ArrayUtils.in()у цьому коді):

ObjectUtils.java

public class ObjectUtils{

    /**
     * A null safe method to detect if two objects are equal.
     * @param object1
     * @param object2
     * @return true if either both objects are null, or equal, else returns false.
     */
    public static boolean equals(Object object1, Object object2){
        return object1==null ? object2==null : object1.equals(object2);
    }

}

ArrayUtils.java

public class ArrayUtils{

    /**
     * Find the index of of an object is in given array, starting from given inclusive index.
     * @param ts  Array to be searched in.
     * @param t  Object to be searched.
     * @param start  The index from where the search must start.
     * @return Index of the given object in the array if it is there, else -1.
     */
    public static <T> int indexOf(final T[] ts, final T t, int start){
        for(int i = start; i < ts.length; ++i)
            if(ObjectUtils.equals(ts[i], t))
                return i;
        return -1;
    }

    /**
     * Find the index of of an object is in given array, starting from 0;
     * @param ts  Array to be searched in.
     * @param t  Object to be searched.
     * @return  indexOf(ts, t, 0)
     */
    public static <T> int indexOf(final T[] ts, final T t){
        return indexOf(ts, t, 0);
    }

    /**
     * Detect if the given object is in the given array.
     * @param ts  Array to be searched in.
     * @param t  Object to be searched.
     * @return  If indexOf(ts, t) is greater than -1.
     */
    public static <T> boolean in(final T[] ts, final T t){
        return indexOf(ts, t) > -1 ;
    }

}

Як ви можете бачити в наведеному вище коді, що існують і інші методи корисності ObjectUtils.equals()і ArrayUtils.indexOf(), які були використані в інших місцях.


Я дуже пізно приєднуюся до цієї дискусії, але оскільки мій підхід до вирішення цієї проблеми, коли я зіткнувся з нею кілька років тому, був дещо іншим, ніж інші відповіді, які вже були розміщені тут, я публікую це рішення, яке я використовував у той час, тут, якщо хтось вважає це корисним.
Абхішек Оза

3

Перевір це

String[] VALUES = new String[] {"AB","BC","CD","AE"};
String s;

for(int i=0; i< VALUES.length ; i++)
{
    if ( VALUES[i].equals(s) )
    { 
        // do your stuff
    } 
    else{    
        //do your stuff
    }
}

1
Це не працює - він буде вводити elseдля кожного елемента, який не відповідає (тому якщо ви шукаєте "AB" у цьому масиві, він піде туди 3 рази, оскільки 3 значення не є "AB ").
Бернхард Баркер

3

Arrays.asList () -> тоді виклик методу містить () завжди буде працювати, але алгоритм пошуку набагато кращий, оскільки вам не потрібно створювати легку обгортку списку навколо масиву, що і робить Arrays.asList () .

public boolean findString(String[] strings, String desired){
   for (String str : strings){
       if (desired.equals(str)) {
           return true;
       }
   }
   return false; //if we get here… there is no desired String, return false.
}

Arrays.asListне є O (n). Це просто легка обгортка. Погляньте на реалізацію.
Патрік Паркер

3

Якщо ви не хочете, щоб це було залежно від регістру

Arrays.stream(VALUES).anyMatch(s::equalsIgnoreCase);

2

Використовуйте Array.BinarySearch(array,obj)для пошуку заданого об'єкта в масиві чи ні.

Приклад:

if (Array.BinarySearch(str, i) > -1)`  true --exists

false - не існує


4
Array.BinarySearchі Array.FindIndexє методами .NET і не існують на Java.
ataylor

@ataylor є Arrays.binarySearch в Java. Але ви маєте рацію, що не Arrays.findIndex
Мент

Зазначимо:The array must be sorted prior to making this call. If it is not sorted, the results are undefined.
Доріан Грей

1

Створіть булевий початковий параметр false. Запустіть цикл, щоб перевірити кожне значення масиву та порівняти зі значенням, на яке ви перевіряєте. Якщо ви коли-небудь отримаєте збіг, встановіть булеве значення true та припиніть циклічне циклічне завершення. Потім запевняють, що булева правда.


1

Спробуйте використовувати метод тестування предикатів Java 8

Ось повний приклад цього.

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class Test {
 public static final List<String> VALUES = Arrays.asList("AA", "AB", "BC", "CD", "AE");

 public static void main(String args[]) {
  Predicate<String> containsLetterA = VALUES -> VALUES.contains("AB");
  for (String i : VALUES) {

   System.out.println(containsLetterA.test(i));
  } 
 }
}

http://mytechnologythought.blogspot.com/2019/10/java-8-predicate-test-method-example.html

https://github.com/VipulGulhane1/java8/blob/master/Test.java


0

використання Spliterator запобіжника запобігає непотрібному породженню а List

boolean found = false;  // class variable

String search = "AB";
Spliterator<String> spl = Arrays.spliterator( VALUES, 0, VALUES.length );
while( (! found) && spl.tryAdvance(o -> found = o.equals( search )) );

found == trueякщо searchвін міститься в масиві


це робить роботу для масивів примітивів

public static final int[] VALUES = new int[] {1, 2, 3, 4};
boolean found = false;  // class variable

int search = 2;
Spliterator<Integer> spl = Arrays.spliterator( VALUES, 0, VALUES.length );


-2

Перевірити це можна двома методами

A) Перетворивши масив у рядок, а потім перевіримо потрібний рядок методом .contains

 String a=Arrays.toString(VALUES);
    System.out.println(a.contains("AB"));
    System.out.println(a.contains("BC"));
    System.out.println(a.contains("CD"));
    System.out.println(a.contains("AE"));

Б) це більш ефективний метод

 Scanner s=new Scanner(System.in);


   String u=s.next();
   boolean d=true;
    for(int i=0;i<VAL.length;i++)
    {
        if(VAL[i].equals(u)==d)
            System.out.println(VAL[i] +" "+u+VAL[i].equals(u));  

    }

1
Перетворення рядків є абсурдно неефективним, а рішення неправильним, наприклад, містить (",") повернеться істинним.
Атуос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.