0
votes

Comment puis-je supprimer tout sauf un élément d'un tableau de cordes d'une ficelle en Java?

J'essaie de tout supprimer d'une chaîne sauf si elle correspond à un élément dans un tableau de chaînes. Je peux le faire avec des caractères individuels avec.

String[] strings = {"1","2","10"};
String foo = "1 2 3 4 5 6 7 8 9 10"
String newString = "";
//some code here


6 commentaires

Votre FOO est-il toujours délimité par des espaces? Avez-vous besoin d'inclure également des espaces s'ils sont trouvés dans Strings ?


@Zephyr Les espaces ne seraient inclus que dans les informations de journal s'il y avait "" inclus dans la matrice, sinon ils seraient enlevés


Donc, il n'y a pas de délimiteur?


Je ne sais pas ce qu'est un délimiteur, je devine non, les espaces blancs ne sont pas importants qu'ils ne sont viens de traiter comme des caractères et aucun n'est nécessaire pour le faire fonctionner


Qu'en est-il de la chaîne 1, 10? Comment pouvez-vous prendre une décision de prendre 1 ou 10? avec la longueur?


@Andrianekenamoise Ouais je pensais que vous pouviez voir quelle est la plus longue chaîne qu'elle correspond, puis ajoutez-la à la newstring et saute sur le reste de la chaîne copiée dans la boucle


4 Réponses :


0
votes

Cela peut ne pas fonctionner dans toutes les situations, mais pour l'exemple spécifique que vous avez posté, nous pouvons obtenir votre résultat avec le code ci-dessous.

Fondamentalement, nous convertissons votre tableau en une liste code > Pour accéder à la méthode contient () code>. Ensuite, nous avons divisé la chaîne d'origine FOO code> afin que nous puissions vérifier si l'une de ces valeurs existe dans le tableau d'origine. P>

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

class Test {
    public static void main(String[] args) {

        String[] strings = {"1", "2", "10"};
        String foo = "1 2 3 4 5 6 7 8 9 10";

        // We'll use a StringBuilder for this
        StringBuilder newString = new StringBuilder();

        // First, we'll convert our strings array to a List so we have access to the [contains] method
        List<String> stringsList = Arrays.asList(strings);

        // Now, let's split foo into an array, using the space as a delimiter
        String[] foos = foo.split(" ");

        // Loop through each entry of foos and compare to each element in stringsList
        for (int i = 0; i < foos.length; i++) {

            if (stringsList.contains(foos[i])) {
                newString.append(foos[i]);
            }
        }

        System.out.println(newString);
    }
}


1 commentaires

pas tout à fait ce que je cherche, bien essayez cependant, je cherche quelque chose qui fonctionnerait dans toutes les situations telles que si j'avais utilisé "12345678910" comme la chaîne de départ que vous obtiendriez "1210" encore



0
votes

Voici ma solution:

    String[] chars = {"1","2","10"};
    //sort the array by length, so we check the longest string first.
    Arrays.sort(chars, (a,b)->b.length()-a.length());
    String foo = "1 2 3 4 5 6 7 8 9 10";
    String newFoo = "";
    for(int i = 0; i <= foo.length();){
        int j = i;
        for(String s : chars){
            if(foo.length() > i + s.length()){
                //find subString instead of character.
                String sub = foo.substring(i, i + s.length());
                if (sub.equals(s)) {
                    //move to the next index. Ex if 10 is at 0, next check start at 2
                    i += sub.length();
                    newFoo += sub;
                    break;
                }
            }
        }
        // check the index if it has been modified
        i = i == j ? ++j : i;
    }
    System.out.println(newFoo);


2 commentaires

Très beaux travaux presque mais parfois, il jette une exception lorsque sur le dernier index de FOO avec la ligne définissant SUB parce que i + s.length () est hors de limites une instruction simple si la relevé devrait résoudre cependant, une fois que cela est réparé I'L MARK comme la réponse


Ouais, une déclaration de contrôle simple devrait résoudre l'exception. Si cela a été utile, s'il vous plaît upvote ou marque comme une réponse correcte. Merci.



0
votes

Vous pouvez essayer un code ci-dessous. Si vous souhaitez sauter des duplicats, vous pouvez utiliser définir , xxx


0 commentaires

0
votes

Je les placerais dans un hashset code> puis filtrer les caractères qui ne sont pas dans cet ensemble.

// put in a nice hash set for speedy lookups.
Set<Character> chars = new HashSet(Arrays.asList('1','2','3'));

// method 1
String foo = "abc123 foo !@#";
String newFoo = "";
for(int i = 0; i < foo.length(); i++){
    char c = foo.charAt(i);
    if(!chars.contains(c)) {
        newFoo += c;
    }
}
System.out.println(newFoo);

// method 2
String result = foo.chars()
        .mapToObj(c -> (char)c)
        .filter(c -> !chars.contains(c))
        .map(c -> String.valueOf(c))
        .collect(Collectors.joining(""));
System.out.println("result is: "+result);


0 commentaires