Java collections convert a string to a list of characters

前端 未结 10 1926
礼貌的吻别
礼貌的吻别 2020-12-02 12:51

I would like to convert the string containing abc to a list of characters and a hashset of characters. How can I do that in Java ?

List

        
相关标签:
10条回答
  • 2020-12-02 13:20

    The most straightforward way is to use a for loop to add elements to a new List:

    String abc = "abc";
    List<Character> charList = new ArrayList<Character>();
    
    for (char c : abc.toCharArray()) {
      charList.add(c);
    }
    

    Similarly, for a Set:

    String abc = "abc";
    Set<Character> charSet = new HashSet<Character>();
    
    for (char c : abc.toCharArray()) {
      charSet.add(c);
    }
    
    0 讨论(0)
  • 2020-12-02 13:24

    You will have to either use a loop, or create a collection wrapper like Arrays.asList which works on primitive char arrays (or directly on strings).

    List<Character> list = new ArrayList<Character>();
    Set<Character> unique = new HashSet<Character>();
    for(char c : "abc".toCharArray()) {
        list.add(c);
        unique.add(c);
    }
    

    Here is an Arrays.asList like wrapper for strings:

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

    This one is an immutable list, though. If you want a mutable list, use this with a 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;
           }
        };
    }
    

    Analogous to this you can implement this for the other primitive types. Note that using this normally is not recommended, since for every access you would do a boxing and unboxing operation.

    The Guava library contains similar List wrapper methods for several primitive array classes, like Chars.asList, and a wrapper for String in Lists.charactersOf(String).

    0 讨论(0)
  • 2020-12-02 13:24
    List<String> result = Arrays.asList("abc".split(""));
    
    0 讨论(0)
  • 2020-12-02 13:30

    IntStream can be used to access each character and add them to the list.

    String str = "abc";
    List<Character> charList = new ArrayList<>();
    IntStream.range(0,str.length()).forEach(i -> charList.add(str.charAt(i)));
    
    0 讨论(0)
  • 2020-12-02 13:31

    You can do this without boxing if you use Eclipse Collections:

    CharAdapter abc = Strings.asChars("abc");
    CharList list = abc.toList();
    CharSet set = abc.toSet();
    CharBag bag = abc.toBag();
    

    Because CharAdapter is an ImmutableCharList, calling collect on it will return an ImmutableList.

    ImmutableList<Character> immutableList = abc.collect(Character::valueOf);
    

    If you want to return a boxed List, Set or Bag of Character, the following will work:

    LazyIterable<Character> lazyIterable = abc.asLazy().collect(Character::valueOf);
    List<Character> list = lazyIterable.toList();
    Set<Character> set = lazyIterable.toSet();
    Bag<Character> set = lazyIterable.toBag();
    

    Note: I am a committer for Eclipse Collections.

    0 讨论(0)
  • 2020-12-02 13:31

    Using Java 8 - Stream Funtion:

    Converting A String into Character List:

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

    Converting A Character List into String:

     String givenStringVariable =  characterList
                                                .stream()
                                                .map(String::valueOf)
                                                .collect(Collectors.joining())
    
    0 讨论(0)
提交回复
热议问题