2016-08-09 25 views
2

ich eine Arraylist meiner benutzerdefinierten Klasse habenWas ist falsch mit meiner Logik

public class DetailedData 
{ 
    String Company; 
    String Model; 
    String Category; 
    String ImageType; 
    String ImageBuffer1; 
    String ImageBuffer2; 
} 

dies ist eine kleine Stichprobe von Daten Ich erhalte, aber das meiste davon folgt demselben Muster.

dell, inspiron 15-R, laptop, Header, 9j4AAQSk, null 
dell, inspiron 15-R, laptop, Thumbnail, iVBORw0KGg, null 
apple, macbook air, laptop, Header, 9j4AAQSk, null 
apple, macbook air, laptop, Thumbnail, iVBORw0KGg, null 
dell, xps 13, laptop, Header, 9j4AAQSk, null 

Ich möchte diese wiederholten Daten kombinieren und speichern, die in einer neuen Liste wie diese

dell, inspiron 15-R, laptop, Header, 9j4AAQSk, iVBORw0KGg 
apple, macbook air, laptop, Header, 9j4AAQSk, iVBORw0KGg 
dell, xps 13, laptop, Header, 9j4AAQSk, null 

ich aber bin nicht korrekte Ausgabe Empfang

Hier ist meine Logik

ArrayList<DetailedData> data=getList(); 
ArrayList<DetailedData> temp = new ArrayList<>(); 
for (int i = 0; i < data.size(); i++) 
{ 
    DetailedData currentData = data.get(i); 
    if (temp.size() == 0) 
    { 
     temp.add(currentData); 
    } else 
    { 
     for (int j = 0; j < temp.size(); j++) 
     { 
      DetailedData tempData = temp.get(j); 
      if (tempData.Company.equals(currentData.Company)) 
      { 
       if (tempData.ImageType.equals(currentData.ImageType)) 
       {} 
       else 
       { 
        temp.get(j).ImageBuffer2 = currentData.ImageBuffer1; 
       } 

      } else 
      { 
       temp.add(currentData); 
      }  
     } 
    } 
} 
+2

Bitte senden Sie den gesamten Code –

+0

Dies ist der gesamte Code –

+1

'Ich bin nicht richtig output' Empfang -> welche Ausgabe Sie empfangen Sie? 'das meiste davon folgt demselben Muster' -> das meiste davon? – lupz

Antwort

1

ich es auf diese Weise genähert:

  • Holen Sie sich die ähnlichen (die Zeilen mit der gleichen Firma, Kategorie und Modell)
  • Gruppieren Sie sie.
  • Mischen Sie sie.
  • Holen Sie sich Ihre Liste.

, die helfen können:

Verwenden addToMap Methode hinzufügen Elemente zu einer HashMap während DetailedData Objekte auf Strom sind. Generieren Sie die Liste daraus, indem Sie sie zusammenführen.

static void addToMap(DetailedData d){ 
    DataIdentity identity = new DataIdentity(); 
    identity.Company = d.Company; 
    identity.Category = d.Category; 
    identity.ImageType = d.ImageType; 
    identity.Model = d.Model; 

    DataValue value = new DataValue(); 
    if(set.containsKey(identity)){ 
     value = set.get(identity); 
    } 

    if(d.ImageType == "Header"){ 
     value.ImageBuffer1 = d.ImageBuffer1; 
    } 
    else if(d.ImageType == "Thumbnail"){ 
     value.ImageBuffer2 = d.ImageBuffer1; 
    } 
    set.put(identity, value); 
} 

static ArrayList<DetailedData> generateList(){ 
    ArrayList<DetailedData> list = new ArrayList<Aatish.DetailedData>(); 
    for(Entry<DataIdentity, DataValue> e : set.entrySet()){ 
     DetailedData data = new DetailedData(); 
     DataIdentity di = e.getKey(); 
     data.Category = di.Category; 
     data.Company = di.Company; 
     data.ImageType = di.ImageType; 
     data.Model = di.Model; 

     DataValue dv = e.getValue(); 
     data.ImageBuffer1 = dv.ImageBuffer1; 
     data.ImageBuffer2 = dv.ImageBuffer2; 
     list.add(data); 
    } 
    return list; 
} 

HashMap<DataIdentity,DataValue> set; 

class DetailedData { 

    String Company; 
    String Model; 
    String Category; 
    String ImageType; 
    String ImageBuffer1; 
    String ImageBuffer2; 

    @Override 
    public String toString() { 
     return "[" + Company + "," + Model + "," + Category + "," + ImageType 
       + "," + ImageBuffer1 + "," + ImageBuffer2 + "]"; 
    } 

} 

static class DataIdentity{ 
    String Company; 
    String Model; 
    String Category; 
    String ImageType; 
    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result 
       + ((Category == null) ? 0 : Category.hashCode()); 
     result = prime * result 
       + ((Company == null) ? 0 : Company.hashCode()); 
     result = prime * result + ((Model == null) ? 0 : Model.hashCode()); 
     return result; 
    } 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     DataIdentity other = (DataIdentity) obj; 
     if (Category == null) { 
      if (other.Category != null) 
       return false; 
     } else if (!Category.equals(other.Category)) 
      return false; 
     if (Company == null) { 
      if (other.Company != null) 
       return false; 
     } else if (!Company.equals(other.Company)) 
      return false; 
     if (Model == null) { 
      if (other.Model != null) 
       return false; 
     } else if (!Model.equals(other.Model)) 
      return false; 
     return true; 
    }  


} 

static class DataValue{ 
    String ImageBuffer1; 
    String ImageBuffer2; 
} 
2

Ich fand einen sauberen Weg, mit Streams:

List<DetailedData> data = getList(); 

List<DetailedData> temp = data.stream() 
    .collect(Collectors.groupingBy(DetailedData::getModel)) 
    .values().stream() 
    .map(DetailedData::merge) 
    .collect(Collectors.toList());   

temp.forEach(System.out::println); 

Ausgang:

dell, xps 13, laptop, Header, 9j4AAQSk, null 
dell, inspiron 15-R, laptop, Header, 9j4AAQSk, iVBORw0KGg 
apple, macbook air, laptop, Header, 9j4AAQSk, iVBORw0KGg 

Wo DetailedData::merge ist eine Methode, die eine Liste von DetailedData in 1. Eg verschmilzt:

public static DetailedData merge(List<DetailedData> list) { 
    if(list.isEmpty()) // Not possible after 'groupingBy'. 
     return null; 

    if(list.size() == 1) 
     return list.get(0); 

    // At least 2 elements: 
    DetailedData ret = list.get(0); 
    ret.ImageBuffer2 = list.get(1).ImageBuffer1; 
    return ret; 
} 

Siehe Full Code

+0

dieser code wird in android app verwendet, so java 8 wird nicht unterstützt, jede andere weise, die sie helfen können? –

Verwandte Themen