Подтвердить что ты не робот

Сборники Java преобразуют строку в список символов

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

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

Ответ 1

Вам придется либо использовать цикл, либо создать обертку коллекции, например 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).

Ответ 2

Я полагаю, в 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());

Ответ 3

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

List<Character> characterList = Chars.asList("abc".toCharArray());
Set<Character> characterSet = new HashSet<Character>(characterList);

Ответ 4

Используйте 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.)

Ответ 5

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

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

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

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

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

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

Ответ 6

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

List<Character> characterList = new ArrayList<Character>();
char arrayChar[] = abc.toCharArray();
for (char aChar : arrayChar) 
{
    characterList.add(aChar); //  autoboxing 
}

Ответ 7

Вы можете сделать это без бокса, если вы используете 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 of 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.

Ответ 8

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

String str = "abc";
List<Character> charList = new ArrayList<>();
IntStream.range(0,str.length()).forEach(i -> charList.add(str.charAt(i)));

Ответ 9

Использование Java 8 - Потоковая функция:

Преобразование строки в список символов:

ArrayList<Character> characterList =  givenStringVariable
                                                         .chars()
                                                         .mapToObj(c-> (char)c)
                                                         .collect(collectors.toList());

Преобразование списка символов в строку:

 String givenStringVariable =  characterList
                                            .stream()
                                            .map(String::valueOf)
                                            .collect(Collectors.joining())