2016-07-13 2 views
0

Ich bin auf der Suche nach dem effektivsten Weg, um alle Elemente von List<String>, die einige String Wert ("value1") zum Beispiel enthalten.JAVA die effiziente Möglichkeit, ein Protokoll aus der Datei zu lesen

Erster Gedanke - einfache Iteration und Hinzufügen der Elemente, die "value1" zu einem anderen enthält List<String> Aber diese Aufgabe muss sehr oft und von vielen Benutzern durchgeführt werden.

Dachte über list.RemoveAll(), aber wie entferne ich alle Elemente, die nicht "value1" enthalten?

Also, was ist der Weg, es am effizientesten zu machen?

UPDATE:

Das ganze Bild - müssen müssen die Protokolle aus der Datei sehr oft und für mehrere Benutzer gleichzeitig zu lesen. Die Protokolle müssen nach dem Benutzernamen aus der Datei gefiltert werden. Jede Zeichenfolge in der Datei enthält den Benutzernamen.

+1

Ist der normale Weg zu langsam für Sie? ... – Idos

+1

1) Warum stören? Dies könnte ein Fall einer vorzeitigen Optimierung sein, also seien Sie bitte genauer. 2) Müssen die Zeichenfolgen _enthalten_ entweder den Wert oder sind sie gleich dem Wert, d. H. Sollte "Hi im String von Wert1" sein. entfernt werden? – Thomas

+0

Wenn es "gleich" sein muss, würde ich es sagen. Sie müssen den Wert " – user1935987

Antwort

1

Aus Ihren Kommentaren scheint es, als wäre Ihre Liste ein paar Protokollanweisungen, die nach Benutzer-ID gruppiert werden sollten (was Ihr "Wert1" wäre). Wenn Sie wirklich brauchen, um die Protokolle sehr oft und für mehrere Benutzer gleichzeitig zu lesen, könnten Sie etwas Caching erwägen, möglicherweise mit Gruppierung nach Benutzer-ID.

Als Beispiel könnten Sie eine zusätzliche Protokolldatei pro Benutzer verwalten und sie nur bei Bedarf anzeigen. Alternativ könnten Sie die neuesten Protokollanweisungen im Speicher behalten, indem Sie einen FIFO-Puffer verwenden, der nach Benutzer-ID gruppiert ist (könnte ein Puffer pro Benutzer und möglicherweise eine weitere LIFO-Schicht darüber sein).

Je nach Anwendungsfall lohnt sich der Aufwand jedoch nicht und Sie können die Liste einfach filtern und filtern, wenn der Benutzer dies anfordert. In diesem Fall würde ich empfehlen, die Datei zeilenweise zu lesen und nur die passenden Zeilen zur Liste hinzuzufügen. Wenn Sie zuerst alles in eine einzelne Liste einlesen und dann nicht übereinstimmende Elemente entfernen, ist es weniger effizient (Sie müssten öfter iterieren, Elemente verschieben usw.) und vorübergehend mehr Speicher verwenden (anstatt alle nicht vorhandenen Elemente zu verwerfen). passende Zeile direkt nach der Überprüfung).

+0

ye ich denke meine Frage war falsch. wahrscheinlich ist es effizienter, tiefer in die Richtung zu gehen, auf die Sie wiesen. Ja, ich muss die Protokolle sehr oft und für mehrere Benutzer gleichzeitig lesen – user1935987

0

Anstelle List, verwenden Sie TreeSet mit bereitgestellten Comparator, so dass alle Strings mit "value1" am Anfang sind. Beim Iterieren, sobald die Zeichenfolge nicht "Wert1" enthält, haben alle verbleibenden nicht, und Sie können die Iteration stoppen.

0

Die Iteration ist wahrscheinlich der einzige Weg, aber man kann damit Java sie so weit wie möglich zu optimieren (und verwenden Sie eine elegante, nicht zwingend notwendig, Syntax) von Java 8 Bäche Einsatz:

// test list 
List<String> original = new ArrayList<String>(){ 
    { 
     add("value1");add("foo");add("foovalue1");add("value1foo"); 
    } 
}; 
List<String> trimmed = original 
    .stream() 
    .filter((s) -> s.contains("value1")) 
    .collect(Collectors.toList()); 
System.out.println(trimmed); 

Ausgabe

[value1, foovalue1, value1foo] 

Hinweise

  • Ein Teil Ihrer Frage, der möglicherweise mehr Informationen benötigt, wird "oft von vielen Benutzern ausgeführt" - dies kann einen Mechanismus zur Handhabung von Gleichzeitigkeit erfordern.
  • Die tatsächliche Funktionalität ist nicht sehr klar. Sie können immer noch Raum haben Sie den Code früh durch Abrufen und Sammeln der "value1" haltigen String s vor dem Aufbau Sie in diesem List
+0

Ich bekomme eine Liste durch das Lesen der Datei – user1935987

+0

@ user1935987 gut das ist es dann. Wenn Sie nur '' value1 "' -containing 'String's aus dieser Datei benötigen, können Sie an Ihrem Deserialisierungsmechanismus arbeiten, indem Sie den Inhalt vorfiltern (** edit **: Details zu dieser Implementierung passen besser zu a neue Frage, falls erforderlich. – Mena

+0

es ist nur das Lesen von Datei durchführen. also denke ich nicht, dass es ein Probs mit Nebenläufigkeit – user1935987

0

Ok, optimieren kann ich vorschlagen, dass Sie die einfachste, ich benutzt hatte. Verwendung eines Iterator, macht es einfacher, aber wenn man mit list.remove gehen (val), wobei val = "Wert1", geben Sie möglicherweise UnsupportedOperationException

Liste list = yourList;/enthält "Wert1"/

for (Iterator<String> itr = list.iterator(); itr.hasNext();){ 
String val = itr.next(); 
if(!val.equals("value1")){ 

    itr.remove(); 

} 


} 

versuchen diese und lassen Sie es mich wissen. :)

+0

warum dies als nicht sinnvoll gemacht wird? –

+0

Nur Code ohne irgendwelche Erklärungen zu veröffentlichen gilt als schlechter Stil. Und "versuche dieses" ist nicht wirklich eine Erklärung. Außerdem: Lazy Formatierung. Die Formatierung ist nicht wirklich schlecht, aber es ist offensichtlich, dass Sie hier wirklich nur das Notwendige getan haben. – GhostCat

2

In Bezug auf die Zeiteffizienz, können Sie nicht zu besseren Ergebnis als linear (O(n)), wenn Sie durch die gesamte Liste durchlaufen wollen.

Die Entscheidung zwischen und ArrayList usw. ist höchstwahrscheinlich irrelevant, da die Unterschiede klein sind.

Wenn Sie eine bessere Zeit als linear wollen Größe aufzulisten, müssen Sie auf einige Annahmen und Voraussetzungen bauen:

  • , wenn Sie vorher wissen, welche Zeichenfolge Sie suchen, werden Sie zusammen eine andere Liste bauen mit Ihrer ursprünglichen Liste nur relevante Datensätze enthält
  • , wenn Sie wissen, dass Sie eine Liste mehrere Male abfragen, Sie einen Index

bauen könnte, wenn Sie nur eine Liste auf Eingang haben, dass jemand hat dir, und Sie müssen diesen hier lesen Einmal setzen und die relevanten Strings finden, dann steckst du mit linearer Zeit fest, da du es nicht vermeiden kannst, die Liste mindestens einmal zu lesen.

Verwandte Themen