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.

riyana
źródło
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.

rsp
źródło
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.

f1sh
źródło
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);
}
finnw
źródło
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.

Landei
źródło
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;
}
atamanroman
źródło
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]
fonji
źródło
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);

zgubiony
źródło
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.

Radhesh Khanna
źródło
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!

HyperNeutrino
źródło
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).

AGéoCoder
źródło
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 () .

ccpizza
źródło
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.

Frank Hou
źródło
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

Suragch
źródło
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";
Rahul Chaube
źródło