我想将包含abc
的字符串转换为字符列表和字符哈希集。在Java中该如何实现?
List<Character> charList = new ArrayList<Character>("abc".toCharArray());
我想将包含abc
的字符串转换为字符列表和字符哈希集。在Java中该如何实现?
List<Character> charList = new ArrayList<Character>("abc".toCharArray());
List<Character> chars = str.chars()
.mapToObj(e->(char)e).collect(Collectors.toList());
Set<Character> charsSet = str.chars()
.mapToObj(e->(char)e).collect(Collectors.toSet());
你将不得不使用循环或创建一个集合包装器(例如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库 包含了一些基本数组类的 类似于列表包装方法,例如Chars.asList,还有一个用于字符串的包装器在 Lists.charactersOf(String) 中。一些第三方库解决了将原始数组和其对应包装类型的集合之间进行转换的问题。其中一个非常常见的是Guava,它提供了一种方便的方法来进行转换:
List<Character> characterList = Chars.asList("abc".toCharArray());
Set<Character> characterSet = new HashSet<Character>(characterList);
Chars.asList
做的就是我答案中asList
方法所做的事情。 - Paŭlo EbermannLists.charactersOf("abc")
,它略微更短,并且不需要调用toCharArray()
。 - Brad Cupit使用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
流。
List<String> result = Arrays.asList("abc".split(""));
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);
}
List<Character> characterList = new ArrayList<Character>();
char arrayChar[] = abc.toCharArray();
for (char aChar : arrayChar)
{
characterList.add(aChar); // autoboxing
}
CharAdapter abc = Strings.asChars("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的提交者。
使用Java 8 - Stream功能:
将字符串转换为字符列表:
ArrayList<Character> characterList = givenStringVariable
.chars()
.mapToObj(c-> (char)c)
.collect(collectors.toList());
将字符列表转换为字符串:
String givenStringVariable = characterList
.stream()
.map(String::valueOf)
.collect(Collectors.joining())
IntStream 可以用于访问每个字符并将它们添加到列表中。
String str = "abc";
List<Character> charList = new ArrayList<>();
IntStream.range(0,str.length()).forEach(i -> charList.add(str.charAt(i)));
java.util.stream.Collectors
是使这段代码片段正常工作所必需的。 - Andrea Gottardochars
方法是在Java 9中引入的 - 在Java 8中不存在。 - Steve ChambersCharSequence
上:https://docs.oracle.com/javase/8/docs/api/java/lang/CharSequence.html#chars-- - Unmitigated