it-swarm.com.de

Wie kann man verhindern, dass Java.lang.String.split () einen führenden leeren String erstellt?

das Übergeben von 0 als Grenzwertargument verhindert, dass leere Zeichenfolgen nachgestellt werden. Wie verhindert man jedoch führende leere Zeichenfolgen?

zum Beispiel

String[] test = "/Test/Stuff".split("/");

ergibt ein Array mit "", "Test", "Stuff".

Ja, ich weiß, ich könnte meinen eigenen Tokenizer rollen ... aber die API-Dokumente für StringTokenizer sagen aus 

"StringTokenizer ist eine ältere Klasse, die aus Gründen der Kompatibilität beibehalten wird Die Verwendung von Code wird jedoch in neuem Code empfohlen.

53
marathon

Ihre beste Wette ist wahrscheinlich, nur ein führendes Trennzeichen zu entfernen:

String input = "/Test/Stuff";
String[] test = input.replaceFirst("^/", "").split("/");

Sie können es allgemeiner machen, indem Sie es in eine Methode einfügen:

public String[] mySplit(final String input, final String delim)
{
    return input.replaceFirst("^" + delim, "").split(delim);
}

String[] test = mySplit("/Test/Stuff", "/");
44
Joe Attardi

Apache Commons bietet genau hierfür eine Utility-Methode: org.Apache.commons.lang.StringUtils.split

StringUtils.split ()

Eigentlich bevorzugen wir in unserem Unternehmen diese Methode jetzt, um in all unseren Projekten aufzuspalten.

21
adranale

Ich glaube nicht, dass es eine Möglichkeit gibt, dies mit der integrierten split-Methode zu erreichen. Sie haben also zwei Möglichkeiten: 

1) Machen Sie Ihren eigenen Split 

2) Durchlaufen Sie das Array nach dem Aufruf von split und entfernen Sie leere Elemente

Wenn Sie Ihren eigenen Split erstellen, können Sie diese beiden Optionen einfach kombinieren

public List<String> split(String inString)
{
   List<String> outList = new ArrayList<>();
   String[]     test    = inString.split("/");

   for(String s : test)
   {
       if(s != null && s.length() > 0)
           outList.add(s);
   }

   return outList;
}

oder Sie können einfach nach dem Trennzeichen suchen, das sich an der ersten Position befindet, bevor Sie split aufrufen und das erste Zeichen ignorieren, wenn

String   delimiter       = "/";
String   delimitedString = "/Test/Stuff";
String[] test;

if(delimitedString.startsWith(delimiter)){
    //start at the 1st character not the 0th
    test = delimitedString.substring(1).split(delimiter); 
}
else
    test = delimitedString.split(delimiter);
6
Hunter McMillen

Ich denke, Sie müssen den ersten leeren String manuell entfernen. Ein einfacher Weg, das zu tun, ist das - 

  String string, subString;
  int index;
  String[] test;

  string = "/Test/Stuff";
  index  = string.indexOf("/");
  subString = string.substring(index+1);

  test = subString.split("/"); 

Dadurch wird die führende leere Zeichenfolge ausgeschlossen.

1
CodeBlue

Ich denke, es gibt keine eingebaute Funktion, um leere Zeichenfolgen in Java zu entfernen. Sie können die Löschzeichenfolge löschen, dies kann jedoch zu Fehlern führen. Zur Sicherheit können Sie dies tun, indem Sie wie folgt ein kleines Stück Code schreiben:

  List<String> list = new ArrayList<String>();

  for(String str : test) 
  {
     if(str != null && str.length() > 0) 
     {
         list.add(str);
     }
  }

  test = stringList.toArray(new String[list.size()]);
1
codeit

Sie können StringTokenizer für diesen Zweck verwenden ...

String test1 = "/Test/Stuff";
        StringTokenizer st = new StringTokenizer(test1,"/");
        while(st.hasMoreTokens())
            System.out.println(st.nextToken());
0
Shashank Kadne

So bin ich um dieses Problem herumgekommen. Ich nehme den String, rufe .toCharArray () auf, um ihn in ein Array von Zeichen aufzuteilen, und dann dieses Array durchlaufen und zu meiner String-Liste hinzufügen (jedes Zeichen mit String.valueOf umschließen). Ich kann mir vorstellen, dass es einen Kompromiss bei der Leistung gibt, aber es scheint eine lesbare Lösung zu sein. Hoffe das hilft! 

 char[] stringChars = string.toCharArray(); 
 List<String> stringList = new ArrayList<>(); 

 for (char stringChar : stringChars) { 
      stringList.add(String.valueOf(stringChar)); 
 }
0