2016-04-12 20 views
0

Ich habe eine String ArraList, die aus der DB ausfüllen. Und ein Object ArrayList, dass jedes Objekt einige String enthält. Nun möchte ich die String ArrayList mit einer der Strings jedes Objekts in der Object ArrayList vergleichen. Wenn es gleich ist, muss das Objekt von Object ArrayList entfernt werden. Hier ist mein Method Code:Vergleichen Sie Objekt ArrayList mit String ArrayList

 public ArrayList checkMatches(ArrayList<IceCream> iceCreams, ArrayList<String> blackListPartCodes) { // output is filtered Object ArrayList and two Input, 
//one is the Object ArrayList and other is String ArrayList 
     int i, j; 
     for(i = 0; i<iceCreams.size(); i++) { // Object ArrayList 
      IceCream iceCream = iceCreams.get(i); 
      for(j = 0; j<blackListPartCodes.size(); j++) { //String ArrayList 
       if ((iceCream.getPartCode().matches(blackListPartCodes.get(j)) || iceCream.getPartCode().equals(blackListPartCodes.get(j)))) { 
        iceCreams.remove(iceCream); 
       } 
      } 
     } 
      return iceCreams; 
     } 

Ok, Wenn ich diese Methode verwenden, es einige Objekte aus meinem Objekt entfernt und die Länge der Arraylist verringern, aber nicht richtig funktionieren. Ich mache etwas falsch?

habe ich diesen Code in meiner Anwendung, wenn Methode funktionieren oder nicht, um zu sehen:

  Toast.makeText(getApplicationContext(), "Before : " + iceCreams.size(), Toast.LENGTH_LONG).show(); //324 

    checkMatches(iceCreams, blackListPartCodes); 
    Toast.makeText(getApplicationContext(), "After : " + iceCreams.size(), Toast.LENGTH_LONG).show(); //200 

Die erste lenght von iceCreams 324 ist und wenn Methode interagieren die lenght ist 200. las ich String Arraylist (blackListPartCodes) von DB, dass, wenn ich select Count(myField) from MyTable benutze es sagt, dass es 215 Reihen hat. das heißt, wenn es richtig funktioniert, soll 324-215 sein, das ist 109. Von der anderen Seite zeige ich eine der Zeichenfolgen jedes Objekts in ListView an. Via dies:

 for(int i = 0; i<iceCreams.size(); i++) { // the filtered iceCreams after calling `checkMatches`method. 
     typeArray.add(iceCreams.get(i).getPartName()); // String ArrayList 
     typeAdapter.getItemViewType(R.id.listView); //Adapter of the Array 
     iceCreamTypeList.setAdapter(typeAdapter); //Adapter set to ListView 
    } 

Aber im Hinblick auf die Felder, die es gibt in blackListPartCodes noch sind.

+0

'aber nicht funktioniert correctly', was Sie damit meinen Sie? –

+0

Lass mich raten: 'ConcurrentModificationException'. Einfach auf SO und im Internet suchbar. Außerdem ist die Verwendung von 'remove (Object)' im Allgemeinen nicht sehr performant, da Sie über die Liste iterieren müssen. Oder, wenn es die richtige nicht entfernt, könnte es nützlich sein, Ihre 'equals'-Implementierung zu zeigen. –

+0

Ich bearbeitete die Frage. –

Antwort

0

Ich habe versucht, Ihre Methode zu vereinfachen. Es iteriert nun Ihre Arrays und platziert die Übereinstimmungen in einer neuen Array-Liste. Die nicht zu berühren oder das Ändern Ihrer bestehende Arrays:

public ArrayList checkMatches(ArrayList<IceCream> iceCreams, ArrayList<String> blackListPartCodes) { 
    ArrayList<IceCream> matches = new ArrayList(); 

    for (IceCream iceCream : iceCreams) { 
    for (String blackListPartCode : blackListPartCodes) { 
     if (blackListPartCode.equals(iceCream.getPartCode()) 
      || blackListPartCode.matches(iceCream.getPartCode())) { 
     matches.add(iceCream); 
     } 
    } 
    } 

    return matches; 
} 
0

Wenn i == 0 und es findet eine Übereinstimmung, entfernt es das Element mit dem Index 0 in Icecream. Alle anderen Elemente in der Liste verringern ihren Index um eins. So in diesem Beispiel, das das Element ursprünglich Index 1 hatte nicht als neuer Index 0 ist geprüft und i == 1.

Stattdessen verfolgt die Übereinstimmungen ergeben und entfernen Sie sie durch die Liste nach laufen.

0

Einfache Lösung Objekte derselben Klasse zu vergleichen, folgen Sie den Schritten:

1. Open your IceCream.java file. 

2. Add following lines of code : 
     @Override 

public boolean equals(Object o) { 
    if (o == null) { 
     return false; 
    } 
    if (getClass() != o.getClass()) { 
     return false; 
    } 
    final IceCream other = (IceCream) o; 
    return this.name == other.name; 
} 

3. Now compare your IceCream class object with another IceCream class object using equals(obj) method. 

Hoffnung! Es klappt. : D

0

I Schließlich herausfinden, was das Problem ist. Ich sollte das IceCream-Objekt in der inneren Schleife identifizieren. Auf diese Weise:

 for(i = 0; i<iceCreams.size(); i++) { 
     for(j = 0; j<blackListPartCodes.size(); j++) { 
      IceCream iceCream = iceCreams.get(i); 

Und nicht auf diese Weise:

for(i = 0; i<iceCreams.size(); i++) { // Object ArrayList 
     IceCream iceCream = iceCreams.get(i); 
     for(j = 0; j<blackListPartCodes.size(); j++) { 
Verwandte Themen