2017-03-05 6 views
-2

Zum Beispiel meines aktueller Code, der alle Elemente in der Liste mit einer Größe von 8 findet:Wie effizient Elemente aus einer Liste ohne get bekommen?

public static void printFamiliesOfLength(int theSize, 
            List<AnagramFamily> theFamilies, 
               PrintStream theOutput) { 
     theOutput.println("Families of length: " + theSize); 
     theOutput.println("-----------------"); 
     for(int i = 0; i < theFamilies.size(); i++) { 
      if(theFamilies.get(i).getFamilySize() == theSize) { 
       theOutput.print(theFamilies.get(i).getCan() + ": "); 
       theOutput.println(theFamilies.get(i)); 
      } 
     } 
    } 

Was ich das Gleiche zu tun versuche, aber tut es ohne .get zu verwenden. Im Moment benötigt mein Programm 10 Sekunden um es auszuführen, ich möchte das auf 1 oder 2 Sekunden reduzieren. Denken Sie daran, Iterator zu verwenden, aber nicht sicher, ob das helfen würde, da es irgendwie durchläuft?

+0

ist 'getFamilySize' ein einfacher Getter? oder machst du da eine andere Logik? – alayor

Antwort

1

Wenn Sie Java verwenden möchten 8, können Sie etwas tun (Beispiel Liste mit Strings):

List<String> filteredNames =theFamilies.stream().filter(x -> 
x.length()==theSize).collect(Collectors.toList()); 

filteredNames.forEach(System.out::print); 
2

Verwenden foreach Schleife:

for(AnagramFamily anagramFamily: theFamilies) { 
    if(anagramFamily.getFamilySize() == theSize) { 
     theOutput.print(anagramFamily.getCan() + ": "); 
     theOutput.println(anagramFamily); 
    } 
} 

Diese erhalten nicht verwenden, aber ich weiß nicht, ob das Problem mit get Methode.

Für Leistungsproblem, die Situation vermeiden können, wenn Sie große LinkedList übergeben und verwenden Sie get(i) und jedes Mal auf der ganzen Liste iterieren.

+1

Da die Eingabe nur als die Schnittstelle 'List ' definiert ist, würde dies zumindest die Leistungsprobleme vermeiden, da hier eine mögliche 'LinkedList' übergeben wird. –

+0

Das funktionierte aus irgendeinem Grund. Nahm die Zeit von 11 Sekunden bis 1.2 Dank. Nicht sicher, warum das aber schneller geht. Wer weiß warum? –

+0

Hier muss etwas anderes los sein. Es gibt keinen Grund, warum eine Schleife für jede Schleife mehr als 9 mal schneller ist als eine herkömmliche for-Schleife. –

1

Sie können eine AnagramFamilyCollection Klasse erstellen, um anstelle der Liste verwendet werden, wo Sie sparen können die familySize in einem Map-Schlüssel.

public class AnagramFamilyCollection { 
    private List<AnagramFamily> anagramFamilies; 
    private Map<Integer, List<AnagramFamilies>> familiesSizes; 

    public void insert(AnagramFamily anagramFamiliy) { 
     anagramFamilies.add(anagramFamiliy); 
     addToMap(familiesSizes, anagramFamiliy); 
    } 

    private void addToMap(Map<Integer, List<AnagramFamilies>> map, AnagramFamily anagramFamiliy) { 
     List<AnagramFamily> list = 
     familiesSizes.getOrDefault(anagramFamiliy.getFamilySize(), new ArrayList()); 
     list.add(anagramFamiliy); 
     familiesSizes.put(anagramFamiliy.getFamilySize(), list); 
    } 

    public List<AnagramFamily> getBySize(int size) { 
     return familiesSizes.get(size); 
    } 
} 

Dann könnten Sie es in Ihrer Methode wie folgt verwenden.

List<AnagramFamily> theFamilies = anagramFamilyCollection.getBySize(theSize); 
for(int i = 0; i < theFamilies.size(); i++) { 
     theOutput.print(theFamilies.get(i).getCan() + ": "); 
     theOutput.println(theFamilies.get(i)); 
} 
Verwandte Themen