1

私はJavaで作業しており、TimestampAndValue型のオブジェクトのリストがあります。

public class TimestampAndValue{
    private double value;
    private long timestamp;

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }

    public double getValue() {
        return value;
    }

    public void setValue(double value) {
        this.value = value;
    }
}

私のリストはこれに似ています:

  • 要素1:タイムスタンプ= 0、値= 5
  • 要素2:タイムスタンプ= 4、値= 6
  • 要素3:タイムスタンプ= 6、値= 10
  • 要素4:タイムスタンプ= 12、値= 1

そして、私はこのリストを出力に入れたいです:

  • 要素1:タイムスタンプ= 0、値= 5
  • 要素2:タイムスタンプ= 1、値= 0
  • 要素3:タイムスタンプ= 3、値= 0
  • 要素4:タイムスタンプ= 4、値= 6
  • 要素5:タイムスタンプ= 5、値= 0
  • 要素6:タイムスタンプ= 6、値= 10
  • 要素7:タイムスタンプ= 7、値= 0
  • 要素8:タイムスタンプ= 11、値= 0
  • 要素9:タイムスタンプ= 12、値= 1

必要なものを簡単に説明しようと思います。2つのタイムスタンプが連続した整数でない場合、それらの間に最小数のゼロを配置する必要があります。たとえば、上記のリストのタイムスタンプ4と6の間の場合は、ゼロを1つだけ配置する必要がありますが、2つのタイムスタンプが2つ以上異なる場合は、最初のタイムスタンプの直後にゼロを配置し、ゼロを配置する必要があります。 2番目のタイムスタンプの直前。これは、タイムスタンプ6と10の間の場合に見られます。また、配置されたゼロに正しいタイムスタンプが設定されている必要があります。

今のところ、それを解決する方法がわかりません。ご支援いただきありがとうございます!

これはあなたの提案を使用して私のために働いた解決策です:

public static List<TimestampAndValue> insertMinimumNumberOfZerosBetweenValues(List<TimestampAndValue> list){
    if(list == null || list.isEmpty() || list.size() == 1)
        return list;

    int i;
    int j;
    long tempTimestamp1;
    long tempTimestamp2;
    long timestampDifference;

    List<TimestampAndValue> outList = new ArrayList<TimestampAndValue>();

    outList.add(list.get(0));
    for(i=0; i<list.size()-1; i++){
        j=i+1;

        tempTimestamp1 = list.get(i).getTimestamp();
        tempTimestamp2 = list.get(j).getTimestamp();
        timestampDifference = tempTimestamp2 - tempTimestamp1;

        if(timestampDifference == 2){
            TimestampAndValue tav = new TimestampAndValue();
            tav.setTimestamp(tempTimestamp1 + 1);
            tav.setValue(0);

            outList.add(tav);
        }
        else if(timestampDifference > 2){
            TimestampAndValue tav = new TimestampAndValue();
            tav.setTimestamp(tempTimestamp1 + 1);
            tav.setValue(0);

            outList.add(tav);

            TimestampAndValue tav2 = new TimestampAndValue();
            tav2.setTimestamp(tempTimestamp2 - 1);
            tav2.setValue(0);

            outList.add(tav2);
        }                

        outList.add(list.get(j));
    }

    return outList;
}
4

4 に答える 4

0

問題を正しく解決していない可能性がありますが、タイムスタンプが存在しない場合にデフォルト値の0を返すメカニズムを実装しようとしましたか?それははるかに効率的でシンプルになります

于 2012-04-19T16:06:43.730 に答える
0

これは宿題ですか?その場合は、そのようにタグ付けしてください。

おそらく私は質問を誤解していますが、単純なループが機能するはずだと思います。リストをタイムスタンプで並べ替えてから、すべての値をループします。連続していないタイムスタンプを見つけたらすぐに、0エントリを挿入します。

于 2012-04-19T16:14:10.740 に答える
0

入力リストからのタイムスタンプのペアを処理して、出力リストを蓄積する必要があります。

outputList = new list of timestamps;

for (int i = 0; i < numerOfTimestamps-1; i++) {
    timestamp1 = inputList.get(i);
    timestamp2 = inputList.get(i+1);

各ペアについて、それらの間の距離を比較します。

  • それらが連続している場合は、timestamp1出力リストに追加します
  • 差が2未満の場合は、出力リストにtimestamp1新しいタイムスタンプを追加します0
  • 差が2以上の場合は、出力リストにtimestamp12つの新しいタイムスタンプを追加します。0

それで

} // close loop

最後のタイムスタンプを出力リストに追加します。(ループによって追加されることはありません。)

空の入力リストを個別に処理する必要があることに注意してください。

于 2012-04-19T16:15:04.877 に答える
0

最初の質問なぜこれらの整数が間に必要なのですか?

次の提案(テストされていません):

List<TimestampAndValue> newList = new ArrayList<TimestampAndValue>();
TimestampAndValue lastAdded = null;    

for( int i = 0; i < oldList.length; i++ ) {   
  if( i > 0 && !isContiguous(lastAdded, oldList[i])) {
    newList.add(new TimestampAndValue(oldList[i].timestamp - 1, 0.0 ) );
  }

  newList.add( oldList[i] );
  lastAdded = oldList[i];

  if( i < (oldList.length - 1) && !isContiguous(oldList[i], oldList[i+1]) {
    lastAdded = new TimestampAndValue(oldList[i].timestamp + 1, 0.0 );
    newList.add( lastAdded );
  }
}

基本的に、リストを繰り返し処理し、要素を新しいリストに挿入します。新しいリストの最後の値が連続していない場合は、最初に0エントリを追加します。次のエントリが連続しない場合は、後で0エントリを追加します。

isContiguous( ... )nullを正しく実装して処理する必要があることに注意してください。

于 2012-04-19T16:16:55.077 に答える