2016-10-18 2 views
2

ich eine benutzerdefinierte Klasse News alle Nachrichten haben eine einzigartige id für sich genannt haben:Java Arraylist mit maßgeschneiderten addAll Methode

public class News{ 
    public long id; 
    public String title; 
    //... 
} 

jetzt ich verwenden möchte, eine maßgeschneiderte ArrayList für meine dataset

Und das ist meine Gewohnheit ArrayList:

public class NewsArrayList<E> extends ArrayList<News> { 
    @Override 
    public boolean addAll(Collection<? extends News> c) { 
     ArrayList<News> b = new ArrayList<>(); 
     boolean notExists; 
     for (News n : c) { 
      notExists = true; 
      for (News ex : this) { 
       if (n.id == ex.id) { 
        notExists = false; 
        break; 
       } 
      } 
      if (notExists) 
       b.add(n); 
     } 
     return super.addAll(b); 
    } 
} 

wenn ich diese Klassen wie diese bin mit:

ArrayList<News> myNews = mDatabase.getNewsByOffset(5,10); // will return first 5 News from database 
NewsArrayList<News> mDataset = new NewsArrayList<>(); 
mDataset.addAll(myNews); 
myNews = mDatabase.getNewsByOffset(4,10); // will return first 4 News from database 
mDataset.addAll(myNews); 

dann dieser Code sicher und optimiert, um nicht dupplicate News Artikel in mDataset mit?

und nur noch eine kurze Frage, diese break;, alle for-loop s oder die innere nur brechen?

.... 
for (News n : c) { 
    notExists = true; 
    for (News ex : this) { 
     if (n.id == ex.id) { 
      notExists = false; 
      break; 
     } 
    } 
    if (notExists) 
     b.add(n); 
} 
.... 
+1

verwenden. Eine 'List' ist der falsche Sammlungstyp, wenn Duplikate vermieden werden sollen. Verwenden Sie stattdessen eine Implementierung von 'Set', z. 'TreeSet', das die Reihenfolge der Elemente entweder in ihrer _naturalen Reihenfolge_ oder in der Reihenfolge, die durch einen bei der Instanziierung eingesteckten Komparator bestimmt wird, erhält. –

+0

Gibt es Beispiele für meinen Fall? @TimothyTruckle – Omid

+0

Und für Ihre letzte Frage, warum Sie nicht einfach in Sysout-Anweisungen zu überprüfen, was passiert, wenn Sie Pause erreichen? – Brunaldo

Antwort

2

Wenn Sie eine Sammlung ohne Duplikat betrachten wollen stattdessen eine Set verwenden, wenn Sie die Bestellung ein LinkedHashSet verwenden behalten wollen, müssen Sie einfach News die Methoden equals und hashCode in Ihrer Klasse außer Kraft zu setzen.

Zum Beispiel wie folgt aus:

@Override 
public boolean equals(final Object o) { 
    if (this == o) return true; 
    if (o == null || this.getClass() != o.getClass()) return false; 

    final News news = (News) o; 

    return this.id == news.id; 

} 

@Override 
public int hashCode() { 
    return (int) (this.id^this.id >>> 32); 
} 

Ihr Code wäre dann:

ArrayList<News> myNews = mDatabase.getNewsByOffset(5,10); // will return first 5 News from database 
Set<News> mDataset = new LinkedHashSet<>(myNews); 
myNews = mDatabase.getNewsByOffset(4,10); // will return first 4 News from database 
mDataset.addAll(myNews); 

Allerdings, wenn Sie wirklich ein List ohne Duplikate verwenden müssen, können Sie nach wie vor als nächstes gehen :

List<News> mDataset = new ArrayList<>(new LinkedHashSet<>(myNews)); 

und nur noch eine kurze Frage, diese Pause ;, alle Fore-Schleifen oder nur die innere brechen?

Es bricht die innere Schleife nur alle für Schleifen auszubrechen ein Etikett als nächstes verwenden:

main: for (News n : c) { 
    ... 
    for (News ex : this) { 
     if (n.id == ex.id) { 
      ... 
      // Break the loop with the label main 
      break main; 
     } 
    } 
    ... 
} 
+0

Entschuldigung, aber was macht das? 'this.id^this.id >>> 32' – Omid

+0

Ein' Set' kann kein Iterator für einen Adapter in meinem Projekt sein – Omid

+0

Es ist was intellij generiert, wenn Sie wissen wollen, was es tut, überprüfen Sie die Bitweisen Operatoren [hier ] (https://www.tutorialspoint.com/java/java_basic_operators.htm) –

0

Dieser Ansatz kann funktionieren, aber ist nicht die einfachste oder effizienteste Weg, dies zu erreichen.

Wenn Sie sicherstellen möchten, dass Sie immer nur eine Kopie eines bestimmten Elements in einer Sammlung haben, würden Sie statt einer Liste allgemein ein Set verwenden. Ein Set stellt automatisch sicher, dass Sie keine Duplikate haben.

für das Set Um richtig zu erkennen und zu vermeiden Duplikate zu speichern, müssen Sie equals() und hashCode() Methoden in Ihrer News Klasse implementieren, so dass es weiß, wenn zwei Instanzen Nachrichten zu prüfen, sei "gleich". In Ihrem Fall sieht es so aus, als würden Sie nur auf die "ID" verweisen, um jede Nachricht eindeutig zu identifizieren. Ihre IDE kann wahrscheinlich equals()/hashCode() -Methoden automatisch generieren - das ist ein häufiges Merkmal.Die am häufigsten verwendete Set-Implementierung ist HashSet. Der Hauptunterschied zwischen der Verwendung eines HashSets und Ihres Ansatzes besteht darin, dass Ihnen das HashSet die Elemente nicht in derselben Reihenfolge gibt, in der Sie sie hinzugefügt haben. Dies ist möglicherweise kein Problem. Wenn dies der Fall ist, können Sie LinkedHashSet statt

Verwandte Themen