Преобразование Char массива в список на Java - программирование

Преобразование Char массива в список на Java

Может ли кто-нибудь помочь мне и сообщить, как преобразовать массив char в список и наоборот. Я пытаюсь написать программу, в которой пользователи вводят строку (например, "Mike is good"), а на выходе каждый пробел заменяется на "%20" (I.e "Mike%20is%20good"). Хотя это можно сделать разными способами, но поскольку вставка и удаление принимают O (1) время в связанном списке, я думал попробовать его со связанным списком. Я ищу способ преобразования массива char в список, обновления списка и последующего его преобразования.

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 в список, а также наоборот.

4b9b3361

Ответ 1

В Java 8 и выше вы можете использовать метод String chars():

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

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

Ответ 2

Поскольку 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);
    }
}

И вот как вы конвертируете List в массив:

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

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

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

Ответ 3

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

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

или, по-гуавски:

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

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

Ответ 4

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

Ответ 5

Вы не можете использовать generics в java с примитивными типами, почему?

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

Но если вы просто хотите сделать замену, там есть методы (а именно java.lang.String 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

Ответ 6

Все операции могут быть выполнены в Java 8 или выше:

К массиву символов из заданной строки

char[] characterArray =      myString.toCharArray();

Чтобы получить список символов из заданной строки

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

Чтобы получить набор символов из заданной строки Примечание: наборы хранят только уникальные значения. так что если вы хотите получить только уникальные символы из строки, это можно использовать.

 HashSet<Character> abc = 
(HashSet<Character>) given.chars().mapToObj(c -> (char)c).collect(Collectors.toSet()); 

Чтобы получить символы в определенном диапазоне из заданной строки:    Получить символ, значение которого в юникоде больше 118.      https://unicode-table.com/en/#basic-latin

Кодовое значение ASCII для символов   * a-z - 97 - 122   * A-Z - 65 - 90

 given.chars().filter(a -> a > 118).mapToObj(c -> (char)c).forEach(a -> System.out.println(a));

Он вернет символы: w, x, v, z

Вы ascii значения в фильтре вы можете играть с символами. Вы можете выполнять операции над персонажем в фильтре, а затем вы можете собрать их в списке или установить в соответствии с вашими потребностями

Ответ 7

Я предполагаю, что самый простой способ сделать это - просто перебрать массив char и добавить каждый элемент в ArrayList of Characters следующим образом:

public ArrayList<Character> wordToList () {
    char[] brokenStr = "testing".toCharArray();
    ArrayList<Character> result = new ArrayList<Character>();
    for (char ch : brokenStr) {
        result.add(ch);
    }
    return result;
}