2016-08-15 1 views
0

私はこのようなデータのList持っている:私は最初と最後のレコードを取得する必要が同じですAndroid - リストのループとフィルタ?

enter image description here

enter image description here

そして、私のモデルは次のとおりです。

public class Modeltest { 
    private String lat; 
    private String lng; 
    private String date; 
    private String firstTime; 
    private String lasttime; 
    private String counts; 
    private String userCode; 

    public String getLat() { 
     return lat; 
    } 

    public void setLat(String lat) { 
     this.lat = lat; 
    } 
    ....... 
     ..... 
      ..... 
} 

私は最初と最後を得ることができます:

List<Unprocessed_DistanceTime_D> listCDM = QDB.DistanceSelect_D(); 
    int count = 1; 
    boolean flag = true; 
    int index; 
    for (int i = 0; i < listCDM.size() - 1; i++) { 
     if (listCDM.get(count).getDate().equalsIgnoreCase(listCDM.get(i).getDate()) && 
       listCDM.get(count).getLat().equalsIgnoreCase(listCDM.get(i).getLat()) && 
       listCDM.get(count).getLng().equalsIgnoreCase(listCDM.get(i).getLng()) && 
       listCDM.get(count).getCounts().equalsIgnoreCase(listCDM.get(i).getCounts())) { 
      if (flag){ 
       index = i; 
       flag = false; 
      } 
     }else { 
      index = i; 
      flag = true; 
     } 
     count++; 
    } 
} 

私の問題はここにあります。これらを別のリストにどのように追加して、そこに単一レコードを追加することができますか?

私は最初と最後のレコードを取得し、別のリストに追加します(上記のモデルを書きました)。

enter image description here

私はここに私のリストを記入すべきである:

if (flag){ 
     index = i; 
     ///HERE 
     flag = false; 
    } 
}else { 
    index = i; 
     ///HERE 
    flag = true; 
} 
+0

別のリストを作成するとどういう意味ですか?あなたは値を得ています。他に何か要りますか? –

+0

新しいリストに保存して、計算時間やポイントなどに使用する必要があります。 –

+0

これはかなり不明瞭な質問です。新しいリストに格納したい文字列がどの基準を満たす必要があるかについて具体的に説明してください。 – SamTebbs33

答えて

2
List<Unprocessed_DistanceTime_D> newListCDM = new ArrayList<>(); 
    if (! listCDM.isEmpty()) { 
     Unprocessed_DistanceTime_D firstInGroup = listCDM.get(0); 
     Unprocessed_DistanceTime_D lastInGroup = firstInGroup; 
     for (int i = 1; i < listCDM.size() - 1; i++) { 
      Unprocessed_DistanceTime_D current = listCDM.get(i); 
      if (inSameGroup(firstInGroup, current)) { // current belongs to the same group 
       lastInGroup = current; 
      } else { // new group 
       // add old group to new list 
       newListCDM.add(firstInGroup); 
       if (lastInGroup != firstInGroup) { 
        newListCDM.add(lastInGroup); 
       } 
      } 
     } 
     // add last group to new list 
     newListCDM.add(firstInGroup); 
     if (lastInGroup != firstInGroup) { 
      newListCDM.add(lastInGroup); 
     } 
    } 

ここローカルによって第一グループのすべてのエントリは、単一ModeltestオブジェクトにこれらのグループをマージIdentityを定義し、より強引な方法です。

これは、入力データがソートされているという事実を無視しているので、これを行うより良い方法はおそらくあります。

List<Unprocessed_DistanceTime_D> list = ...;  

class Identity { 
    private final String lat; 
    private final String lng; 
    private final String date; 
    private final String counts; 

    public Identity(Unprocessed_DistanceTime_D model) { 
     this.lat = model.getLat(); 
     this.lng = model.getLng(); 
     this.date = model.getDate(); 
     this.counts = model.getCounts(); 
    } 

    @Override 
    public int hashCode() { 
     int code = 0; 
     code ^= lat.hashCode(); 
     code ^= lng.hashCode(); 
     code ^= date.hashCode(); 
     code ^= counts.hashCode();    
     return code; 
    } 

    @Override 
    public boolean equals(Object other) { 
     if(other == null) 
      return false; 
     if(!(other instanceof Identity)) 
      return false; 

     Identity io = (Identity) other; 

     return lat.equalsIgnoreCase(io.lat) 
      && lng.equalsIgnoreCase(io.lng) 
      && date.equalsIgnoreCase(io.date) 
      && counts.equalsIgnoreCase(io.counts);    
    } 
} 

List<Modeltest> models = list.stream() 
    .collect(Collectors.groupingBy(Identity::new)) 
    .values().stream() 
    .map(group -> { // Convert groups into single Modeltest 
     if(group.size() == 1) { // Case for single entries 
      Unprocessed_DistanceTime_D e = group.get(0); 
      return new Modeltest(e.getLat(), e.getLng(), e.getDate(), e.getTime(), 
       e.getTime(), e.getCounts(), e.getUserCode()); 
     } 

     // Case for more entries 
     group.sort(Comparator.comparing(Unprocessed_DistanceTime_D::getTime)); 

     Unprocessed_DistanceTime_D first = group.get(0); 
     Unprocessed_DistanceTime_D last = group.get(group.size() - 1); 

     return new Modeltest(first.getLat(), first.getLng(), first.getDate(), 
      first.getTime(), last.getTime(), first.getCounts(), first.getUserCode()); 
    }) 
    .collect(Collectors.toList()); 
0

はここでアルゴリズムのためのアイデアです。おそらくあなたのニーズに変更し、詳細を記入することができます。

関連する問題