0

同じタイプの 2 つの arrayList があり、ValueList の特定の属性に基づいて 2 つを比較したいと考えています。値リスト

ValueList A contains
1,10,5,
2,20,3
3,40,5,
4,60,8

ValueList B contains
2,20,3
3,40,5

line_num に基づいて両方のリストを比較し、別の arraylist Result を作成します。line_num が ValueList A に存在し、ValueList B には存在しない場合、結果の値フィールドには -1 が必要です。結果は次のようになります。

Result
10,-1
20,3
40,5,
60,-1

「Not Found」条件を書き込めません。誰か助けてくれませんか?

私のコード

List<Result> result= new ArrayList<Result>();
for(ValueList data1: valueListA) {
    for (ValueList data2: valueListB) {
        Result inter = new Result();
        if(data1.getLine_num==data2.getLine_num) {
            inter.setKey(data1.getKey());
            inter.setValue(data1.getValue());
            result.add(inter);
        }
    }
}

動作する更新されたコード:

public static  List<Result> result;= new ArrayList<Result>();
    ....

  int i1 = 0,int i2 = 0;
  Result inter = new Result();
  while (i1 < valueListA.size() && i2 < valueListB.size()) {
  ValueList data1 = valueListA.get(i1);
  ValueList data2 = valueListB.get(i2);
  if (data1.getLine_num == data2.getLine_num) {
  // Add the result.      
  result= new ArrayList<Result>();

  inter.setValue(data1.getValue());
  inter.setKey(data1-getKey())
  result.add(inter);
  i1++;
  i2++;
 } else if (data1.getLine_num < data2.getLine_num) {
 result= new ArrayList<Result>();
  // Add -1 because the data was not in valueListB.
   inter.setValue(data1.getValue());
  inter.setKey(-1);
  result.add(inter);
  i1++;
  } else {
   i2++;
 }      

}

4

6 に答える 6

1

コメントで尋ねたように、行が B に含まれていて A に含まれていない場合はどうなるでしょうか? あなたはそれを単に無視するつもりですか?A に同じ line_num を持つ 2 つのアイテムがあり、B にそのような line_num を持つアイテムが 1 つしかない場合はどうなりますか? A の項目に一致する項目が B に 2 つある場合はどうなりますか?

何をしようとしているのかを明確にする必要があります。

あなたのコードから、リストBに一致する「line_num」があるときはいつでも、結果リストに結果として「キー+値」を挿入するようです。

その場合、bList のすべての行番号を含む Set を使用するのが最も簡単で合理的です。

Set<Integer> bLineNums =new HashSet<Integer>();
for (ValueList v : bList) {
  bLineNums.add(v.getLineNum());
}

セットを取得した後は、すべてが簡単です。疑似コードでは、次のようになります。

for (ValueList a : aList) {
  if (bLineNums.contains(a.getLineNum)) {
    result.add(new Result(a.getKey(), a.getValue()));
  }
}
于 2013-07-08T09:40:32.980 に答える
1

の場合ValueList line_numString、次のように比較します。

if(data1.getLine_num.equals(data2.getLine_num)) 

equals()それ以外の場合は、クラスにメソッドを実装しValueList、次のように比較します。

if (data1.equals(data2)) 

public class ValueList {
    ....

    @Override
    public boolean equals(Object o) {
         if (!(o instanceof ValueList)) 
             return false;

         ValueList other= (ValueList)o;

         if (this.line_num != other.line_num)
            return false;

         ....
         return true;
    }
于 2013-07-08T09:05:16.377 に答える