2011-06-12 50 views

Respuesta

37

Tendrá que sea utilice un bucle o cree un contenedor de colecciones como Arrays.asList que funcione en arreglos de caracteres primitivos (o directamente en cadenas).

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

Aquí es un Arrays.asList como envoltura para cadenas:

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

Ésta es una lista inmutable, sin embargo. Si desea una lista mutable, utilizar esto con un 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; 
     } 
    }; 
} 

Análogo a esto se puede aplicar esto para los otros tipos primitivos. Tenga en cuenta que esto normalmente no se recomienda, ya que por cada acceso que haría una operación de boxeo y unboxing.

El Guava library contiene similar List wrapper methods for several primitive array classes, como Chars.asList, y una envoltura para cuerdas en Lists.charactersOf(String).

5

La forma más sencilla es utilizar un bucle for añadir elementos a un nuevo List:

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

for (char c : abc.toCharArray()) { 
    charList.add(c); 
} 

Del mismo modo, para un Set:

String abc = "abc"; 
Set<Character> charSet = new HashSet<Character>(); 

for (char c : abc.toCharArray()) { 
    charSet.add(c); 
} 
4

Tal vez esto podría funcionar -

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

La falta de una buena manera de convertir entre una matriz primitiva y una colección de su correspondiente tipo de envoltorio se resuelve mediante algunas bibliotecas de terceros. Guayaba, muy común, has a convenience method to do the conversion:

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

Parece que he reinventado la rueda aquí ... Supongo que 'Chars.asList' hace acerca de lo que hace el método' asList' en mi respuesta. –

+3

También en Guava es 'Lists.charactersOf (" abc ")' que es un poco más corto y no nos hace llamar 'toCharArray()' –

29

En Java8 puede utilizar corrientes, supongo. Lista de objetos de caracteres:

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

Y conjunto se podría obtener de una manera similar:

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

Utilice una aplicación Java 8 Stream.

myString.chars().mapToObj(i -> (char) i).collect(Collectors.toList()); 

Desglose:

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> 

(no tengo la menor idea de por qué String#chars() devuelve un IntStream.)

1

Puede hacer esto sin el boxeo si utiliza Eclipse Collections:

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

Debido CharAdapter es un ImmutableCharList, llamando collect en él devolverá un ImmutableList.

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

Si desea devolver una caja List, Set o Bag de Character, el siguiente trabajo:

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

Nota: Soy un confirmador de Eclipse Colecciones.

0

IntStream se puede utilizar para acceder a cada carácter y agregarlos a la lista.

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