2013-03-23 17 views
15

Czy ktoś może mi pomóc i powiedzieć, jak przekonwertować tablicę char na listę i odwrotnie. Próbuję napisać program, w którym użytkownicy wprowadzają ciąg znaków (np. "Mike is good"), a na wyjściu wszystkie białe znaki są zastępowane przez "%20" (tj.). Chociaż można to zrobić na wiele sposobów, ale odkąd wstawienie i usunięcie zajęło O (1) czas na liście połączonej, pomyślałem o wypróbowaniu go z połączoną listą. Poszukuję jakiejkolwiek zamiany tablicy char na listę, aktualizując listę, a następnie ją konwertując.Konwersja tablicy znaków na listę w języku Java

public class apples 
{ 
    public static void main(String args[]) 
    { 
     Scanner input = new Scanner(System.in); 
     StringBuffer sb = new StringBuffer(input.nextLine()); 

     String s = sb.toString(); 
     char[] c = s.toCharArray(); 
     //LinkedList<char> l = new LinkedList<char>(Arrays.asList(c)); 
     /* giving error "Syntax error on token " char", 
     Dimensions expected after this token"*/ 
    } 
} 

Więc w tym programie użytkownik wpisując ciąg, który I 'm przechowywanie w StringBuffer, której mam pierwszy konwersji na ciąg znaków, a następnie do char tablicy, ale nie jestem w stanie uzyskać listę l z s.

Byłbym bardzo wdzięczny, gdyby ktoś mógł podać prawidłowy sposób zamiany tablicy char na listę, a także odwrotnie.

+2

nie można używać prymitywny typ danych dla Twojego Lista, potrzebujesz Intead postaci. Jednak Twoje podejście nie zadziała, więc użyj np. ArrayUtils.toObject (char []) z [Apache Commons] (http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html) zamiast tego. – s106mo

Odpowiedz

15

Ponieważ char jest typem pierwotnym, standard Arrays.asList(char[]) nie będzie działać. będzie produkować List<char[]> zamiast List<Character> ... więc co pozostało jest iteracyjne nad tablicy i wypełnić nową listę z danymi z tej tablicy:

public static void main(String[] args) { 
    String s = "asdasdasda"; 
    char[] chars = s.toCharArray(); 

    //  List<Character> list = Arrays.asList(chars); // this does not compile, 
    List<char[]> asList = Arrays.asList(chars); // because this DOES compile. 

    List<Character> listC = new ArrayList<Character>(); 
    for (char c : chars) { 
     listC.add(c); 
    } 
} 

A to, w jaki sposób konwertować listy Powrót do tablicy:

Character[] array = listC.toArray(new Character[listC.size()]); 




zabawne dlatego List<char[]> asList = Arrays.asList(chars); robi to, co robi: asList może wziąć tablicę lub vararg. W tym przypadku char [] chars jest traktowany jako z pojedynczą wartością vararg zchar[]! Więc można również napisać coś podobnego

List<char[]> asList = Arrays.asList(chars, new char[1]); :)

+0

Lista asList = Arrays.asList (chars); // ponieważ TO kompiluje. Nie to się nie kompiluje: Metoda asList (Object []) w tablicach typów nie ma zastosowania dla argumentów (char []) –

+0

@PhilipJ tak, robi to. Robi to w moim Eclipse. Jeśli nie ** NIE ** w twoim - prześlij zgłoszenie błędu. W podanym kodzie 'char []' staje się pojedynczym obiektem, a nie tablicą znaków. I to jest nawet napisane w mojej odpowiedzi. – dantuch

1

nie można użyć rodzajowych w java z prymitywnych typów why?

Jeśli naprawdę chcesz przekonwertować do listy iz powrotem do tablicy, a następnie podejście dantuch za to jeden poprawny.

Ale jeśli po prostu chcesz zrobić wymianę istnieją metody tam (czyli java.lang.String „s replaceAll), które może zrobić to za ciebie

private static String replaceWhitespaces(String string, String replacement) { 
    return string != null ? string.replaceAll("\\s", replacement) : null; 
} 

Można go używać tak:

StringBuffer s = new StringBuffer("Mike is good"); 
System.out.println(replaceWhitespaces(s.toString(), "%20")); 

wyjściowa:

Mike%20is%20good 
13

Inny sposób niż za pomocą pętli byłoby użyj metody Guava 'Chars.asList().Następnie kod przekonwertować ciąg do LinkedList charakteru jest tylko:

LinkedList<Character> characterList = new LinkedList<Character>(Chars.asList(string.toCharArray())); 

lub, w bardziej Guava sposób:

LinkedList<Character> characterList = Lists.newLinkedList(Chars.asList(string.toCharArray())); 

Biblioteka Guava zawiera wiele dobrych rzeczy, więc warto w tym w twoim projekcie.

+1

Do każdego, kto złożył skargę ... jak mogę poprawić tę odpowiedź? –

+0

@Cyrille Ka Nie oddałem głosu, ale domyślam się, że to dlatego, że odpowiedź, którą podałeś, nie jest kompilowana (i prawdopodobnie nie da się jej skorygować). – mbmast

+0

@mbmast O ile mogę powiedzieć, i właśnie próbowałem, oba przykłady kompilują się na Javę 5 do 8, pod warunkiem, że "string" jest zmienną typu wcześniej zainicjalizowanego String i zależność Guava jest zawarta w projekcie. Poinformuj mnie o błędzie kompilatora, jeśli nie powiedzie się na twoim komputerze. –

14

W Javie 8, CharSequence::chars metoda zapewnia sposób jeden wiersz do konwersji String w List<Character>:

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

A jeśli trzeba konwertować char[] do List<Character>, użytkownik może stworzyć String z nim, a potem zastosuj powyższe rozwiązanie. Choć nie będzie to bardzo czytelne i ładne, będzie dość krótkie.

2

Teraz będę pisać tę odpowiedź jako inną opcję dla wszystkich tych twórców, że nie wolno używać żadnych lib ale tylko moc Java 8 :)

char[] myCharArray = { 'H', 'e', 'l', 'l', 'o', '-', 'X', 'o', 'c', 'e' }; 

Stream<Character> myStreamOfCharacters = IntStream 
      .range(0, myCharArray.length) 
      .mapToObj(i -> myCharArray[i]); 

List<Character> myListOfCharacters = myStreamOfCharacters.collect(Collectors.toList()); 

myListOfCharacters.forEach(System.out::println); 
Powiązane problemy