konwersja ciągów na tablice ciągów w java


115

Mam string = "name"; Chcę przekonwertować na tablicy ciągów. Jak mam to zrobić? Czy jest jakaś wbudowana funkcja java? Mogę to zrobić ręcznie, ale szukam wbudowanej funkcji Java.

Chcę mieć tablicę, w której każdy znak ciągu będzie ciągiem. podobnie jak char 'n' będzie teraz ciągiem „n” przechowywanym w tablicy.


10
Chyba nie masz na myśli String[] ary = new String[] { "name" };, jakiej operacji potrzebujesz? na przykład podział znaków?
rsp

Masz na myśli tablicę ciągów? Jak możesz mieć do tego funkcję, byłaby po prostu: String [] array = {"Name"}; czy masz na myśli tablicę znaków?
Woody

1
Chcę mieć tablicę, w której każdy znak ciągu będzie ciągiem. podobnie jak char 'n' będzie teraz ciągiem "n" przechowywanym w tablicy
riyana

Odpowiedzi:


201

Aby rozpocząć zadanie, String.splitdzieli ciągi na wyrażenie regularne, a to wyrażenie może być pustym ciągiem:

String[] ary = "abc".split("");

Daje tablicę:

(java.lang.String[]) [, a, b, c]

Pozbycie się pustego pierwszego wpisu pozostawiamy jako ćwiczenie dla czytelnika :-)

Uwaga: w Javie 8 pusty pierwszy element nie jest już uwzględniany.


21
Uwaga: Używając jdk8, pusty pierwszy wpis nie jest już uwzględniany w wynikowej tablicy. Zobacz stackoverflow.com/questions/22718744/…
Alexis C.

42
String strName = "name";
String[] strArray = new String[] {strName};
System.out.println(strArray[0]); //prints "name"

Drugi wiersz przydziela tablicę String o długości 1. Pamiętaj, że nie musisz samodzielnie określać długości, na przykład:

String[] strArray = new String[1];

zamiast tego długość jest określana przez liczbę elementów w inicjatorze. Za pomocą

String[] strArray = new String[] {strName, "name1", "name2"};

tworzy tablicę o długości 3.


22
Tak naprawdę nie odpowiada na pytanie.
atamanroman,

1
Sprawdź historię wersji pytania, a zobaczysz, że pytanie dotyczy czegoś innego, zanim zostało edytowane. Ta odpowiedź odpowiada pierwszej wersji.
f1sh

14

Zakładając, że naprawdę chcesz mieć tablicę ciągów jednoznakowych (nie a char[]lub Character[])

1. Korzystanie z wyrażenia regularnego:

public static String[] singleChars(String s) {
    return s.split("(?!^)");
}

Ujemne antycypowanie o zerowej szerokości zapobiega dopasowaniu wzorca na początku danych wejściowych, więc nie otrzymasz wiodącego pustego ciągu.

2. Korzystanie z guawy :

import java.util.List;

import org.apache.commons.lang.ArrayUtils;

import com.google.common.base.Functions;
import com.google.common.collect.Lists;
import com.google.common.primitives.Chars;

// ...

public static String[] singleChars(String s) {
    return
        Lists.transform(Chars.asList(s.toCharArray()),
                        Functions.toStringFunction())
             .toArray(ArrayUtils.EMPTY_STRING_ARRAY);
}

1
To wyrażenie regularne jest najlepszym IMO. Uważaj, Java 8 i tak rozwiązała ten konkretny problem.
shkschneider

13

Myślę, że po prostu nie ma takiej potrzeby, ponieważ nie będzie to prostsze niż

String[] array = {"name"};

Oczywiście, jeśli nalegasz, możesz napisać:

static String[] convert(String... array) {
   return array;
}

String[] array = convert("name","age","hobby"); 

[Edytuj] Jeśli chcesz ciągi jednoliterowe, możesz użyć:

String[] s = "name".split("");

Niestety s [0] będzie puste, ale po nim pojawią się litery n, a, m, e. Jeśli jest to problem, możesz użyć np. System.arrayCopy, aby pozbyć się pierwszego wpisu tablicy.


Chcę mieć tablicę, w której każdy znak ciągu będzie teraz sam ciągiem. jak char 'n' będzie teraz ciągiem "n" przechowywanym w tablicy
riyana

@Landei Mam ten String date = "2013/01/05" i kiedy używam .split ("/"), nie zwraca pustego ciągu jako [0] i działa dobrze. Czy jest jakaś różnica między moim rozdzielaczem wyrażeń regularnych a twoim?
Behzad

@Behzad AFAIK masz zabawne zachowanie z pustym wpisem tylko dla pustych wzorców, a nie masz jakiegoś separatora.
Landei

@Landei Daj mi znać, że rozumiem. Masz na myśli, że tylko użycie funkcji „” w funkcji split zwraca 0 jako pierwszą wartość tablicy? tak?
Behzad,

12
String data = "abc";
String[] arr = explode(data);

public String[] explode(String s) {
    String[] arr = new String[s.length];
    for(int i = 0; i < s.length; i++)
    {
        arr[i] = String.valueOf(s.charAt(i));
    }
    return arr;
}

11

W java 8 istnieje metoda, za pomocą której można to zrobić: toCharArray ():

String k = "abcdef";
char[] x = k.toCharArray();

Z tego wynika następująca tablica:

[a,b,c,d,e,f]

Chociaż nie jest to tablica ciągów, jest to idealne rozwiązanie w przypadkach, w których potrzebujesz znaków zamiast głupich dostępów do String.charAt(0)łańcuchów pojedynczych znaków niepotrzebnie! ;)
varun

Ratujesz mi życie @fonji
Amit Sharma

5

Tablica ciągów = tablica znaków?

A może masz ciąg zawierający wiele słów, z których każde powinno być elementem tablicy?

String[] array = yourString.split(wordSeparator);


Chcę mieć tablicę, w której każdy znak ciągu będzie ciągiem. jak char 'n' będzie teraz ciągiem "n" przechowywanym w tablicy
riyana

4

Po prostu użyj .toCharArray()metody w Javie:

String k = "abc";
char[] alpha = k.toCharArray();

To powinno działać dobrze w Javie 8.



2

Możesz użyć string.chars().mapToObj(e -> new String(new char[] {e}));, chociaż jest to dość długie i działa tylko z Javą 8. Oto kilka innych metod:

string.split(""); (Has an extra whitespace character at the beginning of the array if used before Java 8) string.split("|"); string.split("(?!^)"); Arrays.toString(string.toCharArray()).substring(1, string.length() * 3 + 1).split(", ");

Ostatni jest po prostu niepotrzebnie długi, to po prostu dla zabawy!


2

Dodatkowa metoda:

Jak już wspomniano, można dość łatwo przekonwertować oryginalną „nazwę” ciągu na tablicę znaków:

String originalString = "name";
char[] charArray = originalString.toCharArray();

Aby kontynuować ten tok myśli, możesz następnie przekonwertować tablicę char na tablicę String:

String[] stringArray = new String[charArray.length];
for (int i = 0; i < charArray.length; i++){
    stringArray[i] = String.valueOf(charArray[i]);
}

W tym momencie twój stringArray zostanie wypełniony oryginalnymi wartościami z oryginalnego ciągu „name”. Na przykład teraz dzwonię

System.out.println(stringArray[0]);

W tym przypadku zwróci wartość „n” (jako ciąg znaków).


2

Dzielenie pustego ciągu za pomocą String.split () zwraca tablicę pojedynczego elementu zawierającą pusty ciąg . W większości przypadków prawdopodobnie wolisz otrzymać pustą tablicę lub wartość null, jeśli przekazałeś wartość null, co jest dokładnie tym, co dostajesz za pomocą org.apache.commons.lang3.StringUtils.split (str) .

import org.apache.commons.lang3.StringUtils;

StringUtils.split(null)       => null
StringUtils.split("")         => []
StringUtils.split("abc def")  => ["abc", "def"]
StringUtils.split("abc  def") => ["abc", "def"]
StringUtils.split(" abc ")    => ["abc"]

Inną opcją jest google guava Splitter.split () i Splitter.splitToList (), które zwracają odpowiednio iterator i listę. W przeciwieństwie do wersji Apache Splitter wyrzuci NPE na null:

import com.google.common.base.Splitter;

Splitter SPLITTER = Splitter.on(',').trimResults().omitEmptyStrings();

SPLITTER.split("a,b,   c , , ,, ")     =>  [a, b, c]
SPLITTER.split("")                     =>  []
SPLITTER.split("  ")                   =>  []
SPLITTER.split(null)                   =>  NullPointerException

Jeśli wolisz listę niż iterator, użyj Splitter.splitToList () .


1
/**
 * <pre>
 * MyUtils.splitString2SingleAlphaArray(null, "") = null
 * MyUtils.splitString2SingleAlphaArray("momdad", "") = [m,o,m,d,a,d]
 * </pre>
 * @param str  the String to parse, may be null
 * @return an array of parsed Strings, {@code null} if null String input
 */
public static String[] splitString2SingleAlphaArray(String s){
    if (s == null )
        return null;
    char[] c = s.toCharArray();
    String[] sArray = new String[c.length];
    for (int i = 0; i < c.length; i++) {
        sArray[i] = String.valueOf(c[i]);
    }
    return sArray;
}

Metoda String.splitwygeneruje pusty pierwszy, musisz go usunąć z tablicy. To jest nudne.


1

Opierając się na tytule tego pytania, przyszedłem tutaj, aby przekonwertować ciąg znaków na tablicę podciągów podzielonych przez jakiś separator. Dodam tutaj tę odpowiedź dla innych, którzy mogą mieć to samo pytanie.

To tworzy tablicę słów, dzieląc ciąg w każdej spacji:

String str = "string to string array conversion in java";
String delimiter = " ";
String strArray[] = str.split(delimiter);

Tworzy to następującą tablicę:

// [string, to, string, array, conversion, in, java]

Źródło

Przetestowano w Javie 8


1

tutaj jest przekonwertowanie prostego ciągu na tablicę ciągów przy użyciu metody podziału.

String [] stringArray="My Name is ABC".split(" ");

Wynik

stringArray[0]="My";
stringArray[1]="Name";
stringArray[2]="is";
stringArray[3]="ABC";
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.