Преобразование строки в массив «символов» в Java

109

Я хочу преобразовать a Stringв массив объектов класса Character, но не могу выполнить преобразование. Я знаю, что могу преобразовать String в массив примитивного типа данных "char" с помощью этого toCharArray()метода, но это не помогает преобразовать String в массив объектов символьного типа.

Как я могу это сделать?

кгд
источник
6
Что вы имеете в виду под «не соответствует массиву символов»?
barsju
Можете ли вы перефразировать это или сформулировать немного больше, или, возможно, привести пример кода?
blackcompe
Чтобы преобразовать charв Character, используйте Character.valueOf(mychar). Если это массив, зациклить каждый элемент и преобразовать.
ее.
java нужна функция карты, лямбда-выражения.
Эрик Хартфорд

Ответы:

186

Использовать это:

String str = "testString";
char[] charArray = str.toCharArray();
Character[] charObjectArray = ArrayUtils.toObject(charArray);
Кулдип Джайн
источник
27
Я хочу, чтобы ArrayUtils был стандартным для JVM!
Элвин
4
ArrayUtilsэто из commons-lang, а не из JDK, верно?
Эрик Ван
66

Один лайнер с :

String str = "testString";

//[t, e, s, t, S, t, r, i, n, g]
Character[] charObjectArray = 
    str.chars().mapToObj(c -> (char)c).toArray(Character[]::new); 

Что он делает:

  • получить IntStreamиз персонажей (вы также можете посмотреть codePoints())
  • сопоставить каждое значение символа Character(вам нужно привести, чтобы на самом деле сказать, что это действительно a char, и тогда Java автоматически поместит его в коробку Character)
  • получить результирующий массив, вызвав toArray()
Алексис С.
источник
34

Почему бы не написать небольшой метод самому

public Character[] toCharacterArray( String s ) {

   if ( s == null ) {
     return null;
   }

   int len = s.length();
   Character[] array = new Character[len];
   for (int i = 0; i < len ; i++) {
      /* 
      Character(char) is deprecated since Java SE 9 & JDK 9
      Link: https://docs.oracle.com/javase/9/docs/api/java/lang/Character.html
      array[i] = new Character(s.charAt(i));
      */
      array[i] = s.charAt(i);
   }

   return array;
}
Элвин
источник
Будет создано слишком много объектов символов, если это огромная строка.
realPK
2
Почему бы не написать небольшой метод самостоятельно? Поскольку метод уже существует (toCharArray ()), а метод, который уже существует, имеет гораздо больше инженеров, посвященных и заинтересованных в обеспечении производительности и надежности этой функции, чем то, что может быть скопировано / вставлено из сообщения stackoverflow.
HoldOffHunger
1
@HoldOffHunger Вы абсолютно правы. Однако toCharArray () возвращает примитивный тип массива вместо объекта Character по мере необходимости OP. Конечно, вы можете снова просмотреть char [], чтобы преобразовать его в Character []. Но перебирать строковое объявление, создавая объект Character, настолько просто, что я не понимаю, почему бы просто не свернуть свой собственный, если вы не хотите использовать стороннюю библиотеку.
Элвин
6

Надеюсь, приведенный ниже код вам поможет.

String s="Welcome to Java Programming";
char arr[]=s.toCharArray();
for(int i=0;i<arr.length;i++){
    System.out.println("Data at ["+i+"]="+arr[i]);
}

Он работает, и результат:

Data at [0]=W
Data at [1]=e
Data at [2]=l
Data at [3]=c
Data at [4]=o
Data at [5]=m
Data at [6]=e
Data at [7]= 
Data at [8]=t
Data at [9]=o
Data at [10]= 
Data at [11]=J
Data at [12]=a
Data at [13]=v
Data at [14]=a
Data at [15]= 
Data at [16]=P
Data at [17]=r
Data at [18]=o
Data at [19]=g
Data at [20]=r
Data at [21]=a
Data at [22]=m
Data at [23]=m
Data at [24]=i
Data at [25]=n
Data at [26]=g
JDGuide
источник
4
Это совсем не то, о чем просил OP.
Qix - МОНИКА БЫЛА ОФИЦИАЛЬНО
3

String#toCharArrayвозвращает массив char, у вас есть массив Character. В большинстве случаев не имеет значения, используете ли вы автобоксchar или Characterкак есть . Проблема в вашем случае в том, что массивы не упаковываются автоматически, я предлагаю вам использовать массив char ( ).char[]

Сандро
источник
2

В этом случае вы должны написать свой собственный метод. Используйте цикл и получите каждый символ с помощью charAt(i)и установите его в свой Character[]массив с помощью arrayname[i] = string.charAt[i].

Чандра Сехар
источник
2

Этот метод принимает String в качестве аргумента и возвращает массив символов

/**
 * @param sourceString
 *            :String as argument
 * @return CharcterArray
 */
public static Character[] toCharacterArray(String sourceString) {
    char[] charArrays = new char[sourceString.length()];
    charArrays = sourceString.toCharArray();
    Character[] characterArray = new Character[charArrays.length];
    for (int i = 0; i < charArrays.length; i++) {
        characterArray[i] = charArrays[i];
    }
    return characterArray;
}
Локнатх
источник
1

другой способ сделать это.

String str="I am a good boy";
    char[] chars=str.toCharArray();

    Character[] characters=new Character[chars.length];
    for (int i = 0; i < chars.length; i++) {
        characters[i]=chars[i];
        System.out.println(chars[i]);
    }
Баласвами Ваддеман
источник
1

Преобразование строки в массив символов, а затем преобразование массива символов обратно в строку

   //Givent String
   String given = "asdcbsdcagfsdbgdfanfghbsfdab";

   //Converting String to Character Array(It's an inbuild method of a String)
   char[] characterArray = given.toCharArray();
   //returns = [a, s, d, c, b, s, d, c, a, g, f, s, d, b, g, d, f, a, n, f, g, h, b, s, f, d, a, b]

// ОДИН СПОСОБ: обратное преобразование массива символов в строку

  int length = Arrays.toString(characterArray).replaceAll("[, ]","").length();

  //First Way to get the string back
  Arrays.toString(characterArray).replaceAll("[, ]","").substring(1,length-1)
  //returns asdcbsdcagfsdbgdfanfghbsfdab
  or 
  // Second way to get the string back
  Arrays.toString(characterArray).replaceAll("[, ]","").replace("[","").replace("]",""))
 //returns asdcbsdcagfsdbgdfanfghbsfdab

// Второй СПОСОБ: обратное преобразование массива символов в строку

String.valueOf(characterArray);

// Третий СПОСОБ: обратное преобразование массива символов в строку

Arrays.stream(characterArray)
           .mapToObj(i -> (char)i)
           .collect(Collectors.joining());

Преобразование строки в массив символов

Character[] charObjectArray =
                           givenString.chars().
                               mapToObj(c -> (char)c).
                               toArray(Character[]::new);

Преобразование массива символов в массив символов

 String givenString = "MyNameIsArpan";
char[] givenchararray = givenString.toCharArray();


     String.valueOf(givenchararray).chars().mapToObj(c -> 
                         (char)c).toArray(Character[]::new);

Преимущества преобразования массива символов в массив символов вы можете использовать функцию Arrays.stream для получения подмассивов

String subStringFromCharacterArray = 

              Arrays.stream(charObjectArray,2,6).
                          map(String::valueOf).
                          collect(Collectors.joining());
Арпан Сайни
источник
0

если вы работаете с JTextField, это может быть полезно ..

public JTextField display;
String number=e.getActionCommand();

display.setText(display.getText()+number);

ch=number.toCharArray();
for( int i=0; i<ch.length; i++)
    System.out.println("in array a1= "+ch[i]);
М.Шамс Табрез
источник
0

цепочка всегда лучше: D

String str = "somethingPutHere";
Character[] c = ArrayUtils.toObject(str.toCharArray());
ak_2050
источник
1
chaining is always bestЛожь.
Qix - MONICA плохо обращались
1
ArrayUtils не является частью JDK.
mbmast
0

Если вы не хотите полагаться на сторонние API, вот рабочий код для JDK7 или ниже. Я не создаю временные объекты символов, как это сделано в других решениях выше. Циклы foreach более читабельны, смотрите сами :)

public static Character[] convertStringToCharacterArray(String str) {
    if (str == null || str.isEmpty()) {
        return null;
    }
    char[] c = str.toCharArray();
    final int len = c.length;
    int counter = 0;
    final Character[] result = new Character[len];
    while (len > counter) {
        for (char ch : c) {
            result[counter++] = ch;
        }
    }
    return result;
}
realPK
источник
0

Я использовал StringReader класс в java.io . Одна из его функций read(char[] cbuf)считывает содержимое строки в массив.

String str = "hello";
char[] array = new char[str.length()];
StringReader read = new StringReader(str);

try {
    read.read(array); //Reads string into the array. Throws IOException
} catch (IOException e) {
    e.printStackTrace();
}

for (int i = 0; i < str.length(); i++) {
        System.out.println("array["+i+"] = "+array[i]);
}

Запуск этого дает вам результат:

array[0] = h
array[1] = e
array[2] = l
array[3] = l
array[4] = o
Джон К.
источник