Поиски в договоренности цепей

Как реализовывать поиски слова в договоренности типа String?

Пример:

String[] arreglo = { "David", "StackOverflow", "StackOverflow en español" };
String encuentrame = "StackOverflow";
arreglo.?; //¿qué hacer en este caso?
1
задан 17.03.2016, 09:56
3 ответа

Если ты используешь Java 8, лучший выбор состоит в том, чтобы конвертировать твою договоренность в Stream путь Arrays#stream и реализовывать поиски там. Преимущество этой альтернативы состоит в том, что он выносит договоренности примитивных данных.

Пример для твоего случая был бы следующим:

String[] arreglo = { "David", "StackOverflow", "StackOverflow en español" };
String encuentrame = "David";
String resultado = Arrays.stream(arreglo)
                         .filter(s -> s.equals(encuentrame))
                         .findFirst()
                         .orElse(null);
if (resultado != null) {
    System.out.println("Encontrado");
} else {
    System.out.println("No Encontrado");
}

И если ты работал с примитивным как int:

int[] arreglo = { 1, 2, 3};
int encuentrame = 3;
int resultado = Arrays.stream(arreglo)
                      .filter(x -> x == encuentrame)
                      .findFirst()
                      .orElse(-1);
if (resultado != -1) {
    System.out.println("Encontrado");
} else {
    System.out.println("No Encontrado");
}

Гениальное использования Streams дело в том, что ты можешь использовать различные формы, чтобы идентифицировать в элемент, не только используя метод equals. Например, ты можешь проверять, равны ли оба слова, не импортируя ни прописных букв ни строчных букв таким образом:

String[] arreglo = { "David", "StackOverflow", "StackOverflow en español" };
String encuentrame = "dAvId";
String resultado = Arrays.stream(arreglo)
                         .filter(s -> s.equalsIgnoreCase(encuentrame))
                         .findFirst()
                         .orElse(null);
if (resultado != null) {
    System.out.println("Encontrado");
} else {
    System.out.println("No Encontrado");
}

Если у твоей договоренности есть много элементов, и ты будешь искать данные относительно него постоянно, было бы лучше превращать данные о договоренности в один Set (набор), осуществленный из-за HashSet и потом реализовывать поиски всегда против этой структуры. Поиски против одного HashSet они склоняются к тому, чтобы быть быстрее, потому что используют hashCode элемента, уменьшая время поисков в O (1) (понимая, что есть мало столкновений). Здесь пример:

String[] arreglo = { "David", "StackOverflow", "StackOverflow en español" };
Set<String> conjunto = new HashSet<>(Arrays.asList(arreglo));
if (conjunto.contains(...)) {
}
5
ответ дан 24.11.2019, 14:46
  • 1
    рекомендовать и # 237; чтобы использовать encuentrame.equals(s) вместо s.equals(encuentrame), чтобы предотвращать NPEs. Или, если null - стоимость v и # 225; lido, Objects.equals(s, encuentrame). – Darkhogg 07.03.2016, 14:15
  • 2
    Обычно у списка не была бы должна бы быть недействительная стоимость в то время как encuentrame, если он это может быть. –  07.03.2016, 15:28

Как я дополняю в ответы, они существуют varГ-схвати формы, чтобы искать в договоренности strings, например форма comГєn:

public static boolean buscaString(String[] miarray, String valor) {
    for(String s: miarray){
        if(s.equals(valor))
            return true;
    }
    return false;
}

Используя List :

public static boolean buscaString(String[] miarray, String valor) {
    return Arrays.asList(miarray).contains(valor);
}

Как уже comentГі, это не функционирует для arrays примитивных типов.

Используя Set :

public static boolean buscaString(String[] miarray, String valor) {
    Set<String> miSet = new HashSet<String>(Arrays.asList(miarray));
    return miSet.contains(valor);
}
2
ответ дан 24.11.2019, 14:46

Превращать это в список - форма больше простая писания этого:

    String[] arrayString = new String[]{"uno", "dos", "tres"};
    String cadenaBuscar = "tres";
    if(Arrays.asList(arrayString).contains(cadenaBuscar)) {
        System.out.println("Encontrado");
    } else {
        System.out.println("No encontrado");
    }

Это не только функционирует с String, также функционируй с любым другим типом объекта (каждый раз, когда он имел осуществленный правильно equals и hashCode). Оно не функционирует с arrays примитивных типов.

1
ответ дан 24.11.2019, 14:46
  • 1
    Лучше обращать это в Set вместо списка. Другой opci и # 243; n он состоит в том, чтобы упорядочивать это и применяться b и # 250; squeda бинарная, оба м и # 233; все существуют в классе Arrays –  04.03.2016, 15:28
  • 2
    @LuiggiMendoza и #191; Цюй и # 233; м и # 233; все позволяет тебе превращать прямо array в set? – Pablo 04.03.2016, 15:31
  • 3
    new HashSet<>(Arrays.asList(...)) –  04.03.2016, 15:36
  • 4
    @LuiggiMendoza я не вижу чувство, которое должно обращать это сначала в Список и потом в Set, для этого мы это оставляем просто в списке. Она и #250; nica excepci и # 243; n быть и # 237; если ты собирался делать достаточно сравнений с тем же array, тогда podr и # 237; чтобы иметь смысл, потому что в HashSet она b и # 250; squeda - м и # 225; s работоспособный. – Pablo 04.03.2016, 15:40
  • 5
    В зависимости от tama и # 241; или договоренности в действительности. Это м и # 225; s, с Java 8 не имеет чувства обращать это много в список, быть и # 237; в м и # 225; s pr и # 225; ctico и страховка обращать это в Stream и применять м и # 233; совсем filter –  04.03.2016, 15:43