2013-03-23 4 views
15

Может кто-нибудь мне помочь и рассказать, как преобразовать массив char в список и наоборот. Я пытаюсь написать программу, в которой пользователи вводят строку (например, "Mike is good"), а на выходе каждый пробел заменяется на "%20" (I.e "Mike%20is%20good"). Хотя это можно сделать разными способами, но поскольку вставка и удаление принимают O (1) время в связанном списке, я думал попробовать его со связанным списком. Я ищу способ преобразования массива char в список, обновления списка и последующего его преобразования.Преобразование Char Array в список на 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"*/ 
    } 
} 

Таким образом, в этой программе пользователь вводит строку, которую я храню в StringBuffer, который я первый преобразовывая в строку, а затем в char массив, но я не в состоянии получить список l от s.

Я был бы очень признателен, если кто-то может рассказать правильный способ конвертировать массив char в список, а также наоборот.

+2

вы не можете использовать примитивный тип данных для вашего Перечислите, вам нужен персонаж. Однако ваш подход не будет работать, поэтому используйте, например, ArrayUtils.toObject (char []) из [Apache Commons] (http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html). – s106mo

ответ

15

Потому что char примитивный тип, стандарт Arrays.asList(char[]) не будет работать. Он будет производить List<char[]> вместо List<Character> ... так что осталось перебрать массив и заполнить новый список с данными из этого массива:

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

И это, как вы преобразовать список обратно в массив:

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




Забавно, почему List<char[]> asList = Arrays.asList(chars); делает то, что он делает: asList может принимать массив или vararg. В этом случае char [] chars рассматривается как однозначная варгараchar[]! Таким образом, вы можете написать что-то вроде

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

+0

Список asList = Arrays.asList (символы); // потому что это компилируется. Нет, это не скомпилируется: метод asList (Object []) в массиве типа не применим для аргументов (char []) –

+0

@PhilipJ да, это так. Это происходит в моем Eclipse. Если это ** НЕ ** в вашем - отправьте отчет об ошибке. В данном коде 'char []' становится единственным объектом, а не массивом char. И это даже написано в моем ответе. – dantuch

1

Вы не можете использовать дженерики в Java с примитивными типами, why?

Если вы действительно хотите преобразовать в список и обратно в массив, то подход dantuch является исправьте.

Но если вы просто хотите, чтобы сделать замену существуют методы там (а именно java.lang.String «s replaceAll), который может сделать это для вас

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

Вы можете использовать его как это:

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

Выход:

Mike%20is%20good 
13

Другой способ, чем с помощью цикла было бы использование GuavaChars.asList() способ.Затем код для преобразования строки в LinkedList из символов просто:

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

или, в более Гуава образом:

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

Библиотека гуавы содержит много хороших вещей, так что стоит включая его в вашем проекте.

+1

Кому-то, кто сделал downvote ... как я могу улучшить этот ответ? –

+0

@Cyrille Ka Я не голосовал, но думаю, это потому, что ответ, который вы предоставили, не компилируется (и, вероятно, не может быть скорректирован для компиляции). – mbmast

+0

@mbmast Насколько я могу судить, и я просто попытался, оба примера скомпилируются на Java с 5 по 8, при условии, что «строка» является переменной типа String, ранее инициализированной, и зависимость Guava включена в проект. Пожалуйста, сообщите мне ошибку компилятора, если она не работает на вашем компьютере. –

14

В Java 8, CharSequence::chars метод обеспечивает однострочный способ преобразования String в List<Character>:

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

И если вам нужно конвертировать char[] в List<Character>, вы можете создать String от него первого, а затем примените вышеуказанное решение. Хотя он не будет очень читабельным и красивым, он будет довольно коротким.

2

Сейчас я отправлю этот ответ как еще один вариант для тех разработчиков, которые не разрешается использовать любые LIB, но только сила 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); 
Смежные вопросы