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

时间:2011-06-12 02:39:02

标签: java string collections

我想将包含abc的字符串转换为字符列表和字符的哈希集。我怎么能用Java做到这一点?

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

10 个答案:

答案 0 :(得分:40)

您必须使用循环,或创建像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 library包含similar List wrapper methods for several primitive array classes,如Chars.asList,以及Lists.charactersOf(String)中字符串的包装。

答案 1 :(得分:37)

在Java8中,您可以使用我想要的流。 角色对象列表:

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

并且可以以类似的方式获得set:

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

答案 2 :(得分:31)

缺少一种在原始数组和其相应包装类型集合之间进行转换的好方法是由一些第三方库解决的。番石榴,非常常见,has a convenience method to do the conversion

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

答案 3 :(得分:12)

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

答案 4 :(得分:6)

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

答案 5 :(得分:4)

创建一个空的Character列表,然后创建一个循环来获取数组中的每个字符并将它们逐个放入列表中。

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

答案 6 :(得分:1)

如果您使用setSharedPreferencesName(...)

,则无需装箱即可执行此操作
      5         for i in xrange(4):
----> 6             print my_list[i]
      7

ipdb> i
3

由于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); 的{​​{1}},ListSet,请执行以下操作:

Bag

注意:我是Eclipse Collections的提交者。

答案 7 :(得分:0)

IntStream可用于访问每个字符并将其添加到列表中。

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

答案 8 :(得分:0)

使用Java 8-流功能:

将字符串转换为字符列表:

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

将字符列表转换为字符串:

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

答案 9 :(得分:0)

List<String> result = Arrays.asList("abc".split(""));