2016-12-14 7 views
0

Ich versuche, Zeichenfolgen aus einem Array zu filtern. Zum Beispiel habe ich fünf SaitenFiltern von Zeichenfolgen aus einem Array

  1. adcfd
  2. adjnrj
  3. amlkc
  4. nfldkm
  5. cslkls

Wenn ich ein neues Array erstellen möchten, die das gefilterte Array enthält, z.B. es beginnt mit ‚Anzeige‘ wird es ein Array mit zwei Elementen [adcfd, adjnrj]

erstellen oder wenn es beginnt mit ‚a‘ werden wir ein Array mit drei Elementen [adcfd, adjnrj, amlkc]

erhalten Das einzige, was mir in den Sinn kommt, ist, jeden Charakter aus allen Strings zu vergleichen, bis wir zwei "Wahrheiten" bekommen, dann können wir die Schleife beenden.

Wenn es eine Funktion gibt, die ich nicht kenne, kann ich irgendwelche Vorschläge geben?

+0

könnte in [reguläre Ausdrücke] aussehen wollen (https://en.m.wikipedia.org/wiki/Regular_expression) (regex) wenn Sie ein Filtersystem erstellen möchten. –

+1

Werfen Sie einen Blick auf https://docs.oracle.com/javase/8/docs/api/java/lang/String.html und sehen Sie, ob Sie eine Möglichkeit finden, festzustellen, ob eine Zeichenfolge mit einer anderen Zeichenfolge beginnt. – Misha

+0

@ user306856 Wissen Sie, dass Sie eine Lösung akzeptieren können, von der Sie glauben, dass sie Ihnen hilft, indem Sie das Häkchen daneben setzen? – user3437460

Antwort

0

Sie müssen die startsWith Methode der String Klasse in Java verwenden. Zum Beispiel

public static void main(String args[]) { 
    String Str = new String("Welcome to StackOverflow"); 

    System.out.print("Return Value :"); 
    System.out.println(Str.startsWith("Welcome")); 

    System.out.print("Return Value :"); 
    System.out.println(Str.startsWith("StackOverflow")); 
} 

Er druckt:

Return Value :true 
Return Value :false 

bearbeiten: Früher habe ich einfach nicht geben Antwort auf OP Frage, wie ich dachte OP wird von meinem gegebenen Beispiel versuchen. Da andere ihre Antwort bereits geteilt haben, teile ich ein einfaches Code-Snippet, das OP die gewünschte Ausgabe liefert.

String[] strings = {"adcfd", "adjnrj", "amlkc", "nfldkm", "cslkls"}; 
String prefix = "ad"; 
ArrayList<String> result = new ArrayList<>(); 
for (String str : strings) { 
    if (str.startsWith(prefix)) { 
     result.add(str); 
    } 
} 
System.out.println(result.toString()); 

Er druckt:

[adcfd, adjnrj] 
0

Ich denke, können Sie sort String zuerst, dann können Sie erhalten alle abgestimmt String ohne alle String-Element zu vergleichen.

ein alternatives Codesegment:

public class Demo { 
public List<String> test(String[] strs,String filter){ 
    List<String> res = new LinkedList<>(); 
    Arrays.sort(strs); 
    for(String str:strs){ 
     if(str.startsWith(filter)){ 
      res.add(str); 
      continue; 
     } 
     if(str.compareTo(filter)>0){ 
      return res; 
     } 
    } 
    return res; 
} 

public static void main(String[] args){ 
    String[] strs = {"adcfd","adjnrj","amlkc","nfldkm","cslkls"}; 
    Demo demo = new Demo(); 
    String filter = "a"; 
    System.out.println(demo.test(strs, filter)); 
} 
} 

Ausgang:

[adcfd, adjnrj, amlkc] 
0

Es ist ein einfacher Weg, in Java 8.en

Da Stream API ist auf Java ab sofort verfügbar.

public static void main(String[] args) 
{ 
    String[] stringArray = {"adcfd", "adjnrj", "amlkc", "nfldkm", "cslkls"}; 
    List<String> myList = Arrays.asList(stringArray); 
    Object[] result = myList.stream().filter(s -> s.startsWith("ad")).toArray(); 
    for(Object obj : result){ 
     System.out.println(obj); 
    } 
} 

Hinweis: Das wird nur in Java arbeiten 8.

0
String[] strings = {"adcfd", "adjnrj", "amlkc", "nfldkm", "cslkls"}; 
    String prefix = "ad"; 
    String[] result = null; 

    // Use String#startsWith 
    result = Stream.of(strings).filter(str -> str.startsWith(prefix)) 
      .collect(Collectors.toSet()).toArray(new String[0]); 
    Stream.of(result).forEach(System.out::println); //-> adjnrj adcfd 

    // Use String#matches (with regexp) 
    result = Stream.of(strings).filter(str -> str.matches("^" + prefix + ".*$")) 
      .collect(Collectors.toSet()).toArray(new String[0]); 
    Stream.of(result).forEach(System.out::println); //-> adjnrj adcfd 
+0

Warum verwenden Sie 'toSet()' anstelle von 'toList()'? –

+0

@LukeLee Ich habe nicht viel beachtet, habe nur versucht, doppelte Einträge zu entfernen. 'toList' ist auch in Ordnung, wenn es nicht nötig ist. – choasia

Verwandte Themen