繁体   English   中英

在Java中用零填充列表

[英]Fill a List with zeros in Java

我正在用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

总之,我将尽力解释我的需求。 当两个时间戳不是连续的整数时,我需要在它们之间放置最小数目的零。 例如,在上面列表中的时间戳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;
}

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

这是作业吗? 如果是这样,请加上标签。

也许我对这个问题有误解,但我认为应该有一个简单的循环。 按时间戳对列表进行排序,然后遍历所有值。 一旦找到不连续的时间戳,请插入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

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

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

首先是一个问题, 为什么您需要它们之间的整数?

接下来的建议(未经测试):

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM