web-dev-qa-db-fra.com

Java, retourne si List contient String

En Java, je veux vérifier si une chaîne existe dans un List<String> myList.

Quelque chose comme ça:

if(myList.contains("A")){
    //true
}else{
    // false
}

Le problème est que myList peut contenir des données non tronquées:

{'  A', 'B  ', '  C  '}

Je veux qu'il retourne vrai si mon objet 'B' est dans la liste. Comment dois-je faire cela? Je voudrais éviter une structure en boucle.

51
Reddy

Vous devez parcourir votre liste et appeler String#trim pour effectuer une recherche:

_String search = "A";
for(String str: myList) {
    if(str.trim().contains(search))
       return true;
}
return false;
_

OU si vous voulez ignorer la recherche de cas , utilisez:

_search = search.toLowerCase(); // outside loop

// inside the loop
if(str.trim().toLowerCase().contains(search))
_
48
anubhava

Avec Java 8 API de flux:

List<String> myList = Arrays.asList("  A", "B  ", "  C  ");
return myList.stream().anyMatch(str -> str.trim().equals("B"));
66
rogermenezes

Vous pouvez le faire en une seule ligne en utilisant regex:

if (myList.toString().matches(".*\\bA\\b.*"))

Ce code devrait fonctionner assez bien.


BTW, vous pouvez construire l’expression rationnelle à partir d’une variable, comme ceci:

.matches("\\[.*\\b" + Word + "\\b.*]")

J'ai ajouté [ et ] à chaque extrémité pour éviter une correspondance faussement positive lorsque le terme recherché contient un crochet ouvert/fermé au début/à la fin.

14
Bohemian
String search = "A";
for(String s : myList)
    if(s.contains(search)) return true;
return false;

Cela va parcourir chaque chaîne de la liste et vérifier si elle contient la chaîne que vous recherchez. Si vous ne voulez piéger que des espaces, vous pouvez le faire:

String search = "A";
for(String s : myList)
    if(s.replaceAll(" ","").contains(search)) return true;
return false;

qui remplacera d’abord les espaces par des chaînes vides avant la recherche. De plus, si vous voulez juste couper la chaîne en premier, vous pouvez faire:

String search = "A";
for(String s : myList)
    if(s.trim().contains(search)) return true;
return false;
7
Aza

Essaye ça:

for(String str: myList) {
    if(str.trim().equals("A"))
       return true;
}
return false;

Vous devez utiliser str.equals ou str.equalsIgnoreCase au lieu de contains car contains dans string ne fonctionne pas de la même façon que contains dans List

List<String> s = Arrays.asList("BAB", "SAB", "DAS");
s.contains("A"); // false
"BAB".contains("A"); // true
4
nkukhar

Pour ce faire, vous pourrez peut-être utiliser une bibliothèque de correspondance de chaîne approximative, par exemple. SecondString , mais c'est presque certainement excessif - utilisez simplement l'une des réponses for-loop fournies à la place.

2

Vous pouvez utiliser votre propre code. Vous n'avez pas besoin d'utiliser la structure en boucle si vous ne voulez pas utiliser la structure en boucle comme vous l'avez dit ci-dessus. Vous devez seulement faire la mise au point pour supprimer l’espace ou couper la chaîne de la liste.

Si vous utilisez Java8, vous pouvez simplement couper la chaîne en utilisant la seule ligne du code:

myList = myList.stream().map(String :: trim).collect(Collectors.toList());

L'importance de la ligne ci-dessus est que, dans le futur, vous pouvez également utiliser une liste ou un ensemble. Maintenant, vous pouvez utiliser votre propre code:

if(myList.contains("A")){
    //true
}else{
    // false
}
1
vikash