[英]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;
}
}
我的清单与此类似:
我想在输出中包含此列表:
总之,我将尽力解释我的需求。 当两个时间戳不是连续的整数时,我需要在它们之间放置最小数目的零。 例如,在上面列表中的时间戳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
添加到输出列表 timestamp1
和一个新的带有0
时间戳添加到输出列表中 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.