Как удалить все, кроме элемента из массива строк из строки в Java? - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь удалить все из строки, если она не соответствует элементу в массиве строк.Я могу сделать это с отдельными символами.

char[] chars = {'1','2','3'};
  String foo = "abc123 foo !@#";
  String newFoo = "";
  for(int i = 0; i < foo.length(); i++){
     for(char c : chars){
        if(foo.charAt(i) == c){
           newFoo+=c;
        }
     }
  }

, тогда newFoo будет "123", потому что все остальные символы были удалены, кроме символов в массиве символов (1,2,3).этот код принимает строку foo и удаляет все символы, не входящие в символы массива, и создает строку newFoo с оставшимися символами.Вот блок-схема этой программы Блок-схема

Я ищу, как сделать это с массивом строк вместо массива символов с кодом вдоль этих строк.

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

, в конце концов, newString будет «1210».Я пытался сделать это в течение нескольких часов, но мне еще предстоит придумать рабочий код для этого, любая помощь будет оценена.

Ответы [ 4 ]

0 голосов
/ 23 февраля 2019

Я бы поместил их в HashSet, а затем отфильтровал символы, которых нет в этом наборе.

// 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 голосов
/ 23 февраля 2019

Вот мое решение:

    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);
0 голосов
/ 23 февраля 2019

Вы можете попробовать код ниже.Если вы хотите пропустить дубликаты, вы можете использовать Set,

 String[] strings = {"1", "2", "10"};
String foo = "1 2 3 4 5 6 7 8 9 10".replaceAll("\\s","");

StringBuilder newString = new StringBuilder();

List<String> stringsList = Arrays.asList(strings);

//Set can be used to avoid duplicates like "1 1 2 2 4 4"
Set<String> resSet=new HashSet<String>();
// Loop through each entry of foos and compare to each element in stringsList
for (int i = 0; i < foo.length(); i++) {
    //if current char and next is 10 add it and continue
    if((String.valueOf(foo.charAt(i))+String.valueOf(foo.charAt(i+1))).equals("10") && stringsList.contains("10"))
    {
        resSet.add("10");

        //Extra operation in case you want to avoid duplication
        newString.append(10);
        i++;
        continue;
    }
    //if match found add it
    if (stringsList.contains(String.valueOf(foo.charAt(i)))) {
        newString.append(String.valueOf(foo.charAt(i)));

      //Extra operation in case you want to avoid duplication
        resSet.add(String.valueOf(foo.charAt(i)));
    }
}

System.out.println(newString);
System.out.println(resSet);
0 голосов
/ 23 февраля 2019

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

По сути, мы конвертируем ваш массив в List вполучить доступ к методу contains().Затем мы разделяем исходную строку foo, чтобы мы могли проверить, существует ли какое-либо из этих значений в исходном массиве.

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);
    }
}


Запуск этого примера приводит к окончательному выводу: 1210
...