Удалить часть элемента в массиве Java String - PullRequest
0 голосов
/ 07 января 2019

Я хочу получить ввод от пользователя в массиве String. Удалите несколько частей и распечатайте их в другом блоке текстовой области.

Например:

Ввод в массив строк.

===========

Мистер: Алекс Симмонс
Мисс: Сьюзен Кент
Миссис Дж. Петерсон

===========

Я хочу, чтобы вывод выглядел примерно так. После удаления Mr :, Miss :, Mrs: остальные значения в одной строке или элементе

===========
Алекс Симмонс Сьюзен Кент Дж. Петерсон

===========

Вот код, с которым я работаю.

private void jButton18ActionPerformed(java.awt.event.ActionEvent evt) {
        String[] names = jTextArea11.getText().split("\\n");


        List<String> myList = new ArrayList<>(Arrays.asList(names));


        myList.remove("Mr:");
        myList.remove("Miss:");
        myList.remove("Mrs:");

        names = myList.toArray(new String[0]);

        jTextArea12.setText(Arrays.toString(names));
}

Мне кажется, вышеприведенный код не работает ..

Вывод:
[Мистер: Алекс Симмонс, мисс: Сьюзен Кент, миссис: Дж. Петерсон]

"[]" скобки в конце и разделенные "," это не то, что я имел в виду. Также, похоже, что remove () не работает.

Ответы [ 7 ]

0 голосов
/ 07 января 2019

Это заменит строки в списке на преобразованные строки и будет работать для любого количества строк,

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

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Mr: Alex Simmons", "Miss: Susan Kent", "Mrs: J. Peterson", "Mr: Abc", "Miss: Cdf");
        for (int i = 0; i < list.size(); i++) {
            list.set(i, list.get(i).replace("Mr:", ""));
            list.set(i, list.get(i).replace("Miss:", ""));
            list.set(i, list.get(i).replace("Mrs:", ""));
        }
        System.out.println(list);
    }
}
0 голосов
/ 07 января 2019

Другое решение, использующее substring. Преимущество этого подхода заключается в том, что название (Mr, Miss и т. Д.) Не является жестко закодированным.

Если заголовок есть, он пропустит эту часть. В противном случае он будет иметь полное имя (см. Значение 1Peterson в списке).

public static void main(String[] args) {
    List<String> stringList = new ArrayList<>();
    stringList.add("Mr: Alex Simmons");
    stringList.add("Miss: Susan Kent");
    stringList.add("Mrs: J. Peterson");
    stringList.add("1Peterson");

    List<String> outList = new ArrayList<>();

    for (String s : stringList) {
        outList.add(s.substring(s.indexOf(": ")+1));
    }

    System.out.println(outList);
}

Выход: -

[Алекс Симмонс, Сьюзен Кент, Дж. Петерсон, 1 Петерсон]

0 голосов
/ 07 января 2019

Это один из способов сделать это с помощью подстроки. Это объединит все имена без пробелов.

    String[] names = {"Mr. Smith","Mrs. Smith","Ms. Smith"};

    String newString = "";

    for (int i = 0; i < names.length; i++) {
        if (names[i].substring(0, 3).equals("Mr.") || names[i].substring(0, 3).equals("Ms.")) {
            newString += names[i].substring(4);
        } else if (names[i].substring(0,4).equals("Mrs.")) {
            newString += names[i].substring(5);
        }
    }
0 голосов
/ 07 января 2019

Если вы используете Java 8, взгляните на функцию карты

myList = myList.stream().map(s -> 
s.replaceAll("Mr|Miss|Mrs:","")).collect(Collectors.toList())
0 голосов
/ 07 января 2019

Вам нужно изменить элемент, а не в списке, например:

List<String> myList = new ArrayList<>(Arrays.asList(names));
List<String> res = new ArrayList<>();
for(String name : myList){
    res.add(name.replaceAll("((Mr:|Miss:|Mrs:)\\s)", "");
}

str = String.join(", ", res);
jTextArea12.setText(str);

Вы также можете использовать операцию Stream и перейти непосредственно к String, не передавая в массив:

List<String> myList = new ArrayList<>(Arrays.asList(names));
String str = myList.stream()
                   .map(name -> name.replaceAll("((Mr:|Miss:|Mrs:)\\s)", ""))
                   .collect(Collectors.joining(", "));
jTextArea12.setText(str);
0 голосов
/ 07 января 2019

В настоящее время при выполнении трех remove вызовов:

myList.remove("Mr:");
myList.remove("Miss:");
myList.remove("Mrs:");

По сути, вы пытаетесь "удалить" Mr: "," Miss: "и" Mrs: "из myList, если они существуют", но это не то, что вы хотите, а то, что вы хотите, это "удалить указанные данные от элементов внутри myList.

Вы можете сделать это с помощью обычного цикла for, но вам может быть удобнее использовать поток здесь, так как вам позже потребуется присоединиться к результату и установить jTextArea12 для него.

Таким образом, после разделения вы можете использовать поток для достижения указанного требования:

String result = Arrays.stream(names)
          .map(s -> s.replace("Mr:", "").replace("Miss:", "").replace("Mrs:", ""))
          .collect(Collectors.joining(" "));

jTextArea12.setText(result);

полный код:

private void jButton18ActionPerformed(java.awt.event.ActionEvent evt) {
     String[] names = jTextArea11.getText().split("\\n");

     String result = Arrays.stream(names)
              .map(s -> s.replace("Mr:", "")
                         .replace("Miss:", "").replace("Mrs:", ""))
              .collect(Collectors.joining(" "));

     jTextArea12.setText(result);
}
0 голосов
/ 07 января 2019

Ваш код неверен. Вы пытаетесь удалить элемент из списка. Попробуйте код ниже. Это потеряет ваш список. Из каждого элемента он заменит желаемую строку пустой строкой

 for (int i=0; i< myList.size();i++) {
      String newVal = myList.get(i).replace("Mr:", "").replace("Miss:", "").replace("Mrs:", "");
            myList.add(i,newVal);

}

Обновление: есть небольшая коррекция. После замены мы должны сбросить значение замен в списке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...