用Java填充列表中的零

时间:2012-04-19 16:03:35

标签: java list fill zero

我在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:timestamp = 0,value = 5
  • 元素2:timestamp = 4,value = 6
  • 元素3:时间戳= 6,值= 10
  • 元素4:timestamp = 12,value = 1

我想在输出中列出这个列表:

  • 元素1:timestamp = 0,value = 5
  • 元素2:timestamp = 1,value = 0
  • 元素3:timestamp = 3,value = 0
  • 元素4:timestamp = 4,value = 6
  • 元素5:timestamp = 5,value = 0
  • 元素6:timestamp = 6,value = 10
  • 元素7:timestamp = 7,value = 0
  • 元素8:timestamp = 11,value = 0
  • 元素9:timestamp = 12,value = 1

我会试着解释一下我需要什么。当两个时间戳不是连续的整数时,我需要在它们之间放置最小数量的零。例如,在上面列表中的时间戳4和6之间的情况下,我只需要放置一个零,但是在两个时间戳相差两个或更多的情况下,我需要在第一个时间戳和零之后放置一个零紧接在第二个时间戳之前。在时间戳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 个答案:

答案 0 :(得分:0)

也许我没有正确解决您的问题,但您是否尝试实现一种机制,如果时间戳不存在,则返回默认值0?它将更加高效和简单

答案 1 :(得分:0)

这是家庭作业吗?如果是这样,请标记为。

也许我误解了这个问题,但我认为一个简单的循环应该可行。按时间戳对列表进行排序,然后遍历所有值。一旦找到不连续的时间戳,请插入0条目。

答案 2 :(得分: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,则将timestamp1和两个带0的新时间戳添加到输出列表

然后

} // close loop

并将最后一个时间戳添加到输出列表中。 (它永远不会被循环添加。)

请注意,您需要单独处理空输入列表。

答案 3 :(得分: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。