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);
如果你想返回一个盒装的List
, Set
或Character
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)));