Java集合将string转换为字符列表

我想将包含abc的string转换为字符列表和字符哈希集。 我怎样才能在Java中做到这一点?

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

你将不得不使用一个循环,或者创build一个像Arrays.asList这样的集合包装器,它可以在原始字符数组上(或直接在string上)工作。

 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像string的包装:

 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; } }; } 

类似于这个,你可以为其他原始types实现这个。 请注意,通常不build议使用这种方式,因为对于每个访问,您都会执行装箱和拆箱操作。

Guava库包含几个基本数组类 (如Chars.asList )和Lists.charactersOf(String)中 String的封装器的类似List封装器方法 。

在Java8中,你可以使用我想的stream。 字符对象列表:

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

设置可以通过类似的方式获得:

 Set<Character> charsSet = str.chars().mapToObj(e->(char)e).collect(Collectors.toSet()); 

缺less一种在原始数组和相应的包装types集合之间进行转换的好方法是由一些第三方库来解决的。 番石榴是一种很常见的番石榴,它有一种方便的方法来进行转化 :

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

最直接的方法是使用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); } 

使用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<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); 

如果你想返回一个盒装的ListSetCharacter Bag ,下面的工作:

 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)));