Коллекции Java преобразуют строку в список символов - PullRequest
44 голосов
/ 12 июня 2011

Я хотел бы преобразовать строку, содержащую abc, в список символов и хэш-набор символов. Как я могу сделать это на Java?

List<Character> charList = new ArrayList<Character>("abc".toCharArray());

Ответы [ 8 ]

41 голосов
/ 12 июня 2011

Вам придется либо использовать цикл, либо создать обертку для коллекции, например Arrays.asList, которая работает с массивами примитивных символов (или непосредственно со строками).

List<Character> list = new ArrayList<Character>();
Set<Character> unique = new HashSet<Character>();
for(char c : "abc".toCharArray()) {
    list.add(c);
    unique.add(c);
}

Вот как Arrays.asListобертка для строк:

public List<Character> asList(final String string) {
    return new AbstractList<Character>() {
       public int size() { return string.length(); }
       public Character get(int index) { return string.charAt(index); }
    };
}

Хотя этот список неизменен.Если вам нужен изменяемый список, используйте его с char[]:

public List<Character> asList(final char[] string) {
    return new AbstractList<Character>() {
       public int size() { return string.length; }
       public Character get(int index) { return string[index]; }
       public Character set(int index, Character newVal) {
          char old = string[index];
          string[index] = newVal;
          return old;
       }
    };
}

Аналогично этому вы можете реализовать это для других примитивных типов. Обратите внимание, что обычно это не рекомендуется, поскольку для каждого доступа вы будете выполнять операции упаковки и распаковки.

Библиотека Guava содержит аналогичную обертку Listметоды для нескольких классов примитивных массивов , например Chars.asList , и оболочки для String в Lists.charactersOf (String) .

39 голосов
/ 26 июля 2015

В Java8 вы можете использовать потоки, я полагаю.Список объектов персонажей:

List<Character> chars = str.chars().mapToObj(e->(char)e).collect(Collectors.toList());

И набор можно получить аналогичным образом:

Set<Character> charsSet = str.chars().mapToObj(e->(char)e).collect(Collectors.toSet());
31 голосов
/ 12 июня 2011

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

List<Character> characterList = Chars.asList("abc".toCharArray());
Set<Character> characterSet = new HashSet<Character>(characterList);
13 голосов
/ 06 января 2017

Используйте Java 8 Stream.

myString.chars().mapToObj(i -> (char) i).collect(Collectors.toList());

Разбивка:

myString
    .chars() // Convert to an IntStream
    .mapToObj(i -> (char) i) // Convert int to char, which gets boxed to Character
    .collect(Collectors.toList()); // Collect in a List<Character>

(я абсолютно не знаю, почему String#chars() возвращает IntStream.)

7 голосов
/ 12 июня 2011

Самый простой способ - использовать цикл for для добавления элементов в новый List:

String abc = "abc";
List<Character> charList = new ArrayList<Character>();

for (char c : abc.toCharArray()) {
  charList.add(c);
}

Аналогично, для Set:

String abc = "abc";
Set<Character> charSet = new HashSet<Character>();

for (char c : abc.toCharArray()) {
  charSet.add(c);
}
4 голосов
/ 12 июня 2011

Создайте пустой список символов, а затем создайте цикл, чтобы получить все символы из массива и поместить их в список один за другим.

List<Character> characterList = new ArrayList<Character>();
char arrayChar[] = abc.toCharArray();
for (char aChar : arrayChar) 
{
    characterList.add(aChar); //  autoboxing 
}
1 голос
/ 23 июня 2017

Вы можете сделать это без бокса, если используете Eclipse Collections :

CharAdapter abc = CharAdapter.adapt("abc");
CharList list = abc.toList();
CharSet set = abc.toSet();
CharBag bag = abc.toBag();

Поскольку CharAdapter является ImmutableCharList, при вызове collect будет возвращено ImmutableList.

ImmutableList<Character> immutableList = abc.collect(Character::valueOf);

Если вы хотите вернуть List, Set или Bag из Character в штучной упаковке, будет работать следующее:

LazyIterable<Character> lazyIterable = abc.asLazy().collect(Character::valueOf);
List<Character> list = lazyIterable.toList();
Set<Character> set = lazyIterable.toSet();
Bag<Character> set = lazyIterable.toBag();

Примечание: я являюсь коммиттером для Eclipse Collections.

0 голосов
/ 23 сентября 2017

IntStream может использоваться для доступа к каждому персонажу и добавления их в список.

String str = "abc";
List<Character> charList = new ArrayList<>();
IntStream.range(0,str.length()).forEach(i -> charList.add(str.charAt(i)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...