Я хотел бы преобразовать строку, содержащую abc
, в список символов и хэш-набор символов. Как я могу это сделать на Java?
List<Character> charList = new ArrayList<Character>("abc".toCharArray());
Я хотел бы преобразовать строку, содержащую abc
, в список символов и хэш-набор символов. Как я могу это сделать на Java?
List<Character> charList = new ArrayList<Character>("abc".toCharArray());
Вам придется либо использовать цикл, либо создать обертку коллекции, например 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).
Я полагаю, в 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());
Отсутствие хорошего способа преобразования между примитивным массивом и набором его соответствующего типа оболочки решается некоторыми сторонними библиотеками. Гуава, очень распространенная, имеет удобный способ для преобразования:
List<Character> characterList = Chars.asList("abc".toCharArray());
Set<Character> characterSet = new HashSet<Character>(characterList);
Используйте 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
.)
Самый простой способ - использовать цикл 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);
}
Создайте пустой список символов, а затем создайте цикл, чтобы получить все символы из массива и поместить их в список по одному.
List<Character> characterList = new ArrayList<Character>();
char arrayChar[] = abc.toCharArray();
for (char aChar : arrayChar)
{
characterList.add(aChar); // autoboxing
}
Вы можете сделать это без бокса, если вы используете 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.
IntStream может использоваться для доступа к каждому символу и добавления их в список.
String str = "abc";
List<Character> charList = new ArrayList<>();
IntStream.range(0,str.length()).forEach(i -> charList.add(str.charAt(i)));
Использование Java 8 - Потоковая функция:
Преобразование строки в список символов:
ArrayList<Character> characterList = givenStringVariable
.chars()
.mapToObj(c-> (char)c)
.collect(collectors.toList());
Преобразование списка символов в строку:
String givenStringVariable = characterList
.stream()
.map(String::valueOf)
.collect(Collectors.joining())