2012-04-19 99 views
1

我在Java中工作,我有型TimestampAndValue的對象的列表:用零填充列表中的Java

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:添estamp = 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

你必須處理對從輸入列表的時間戳的,積累的輸出列表:

outputList = new list of timestamps; 

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

對於每對比較它們之間的距離:

  • 如果它們contiguos,添加timestamp1輸出清單
  • 如果差值小於2,則添加timestamp1並添加新的時間戳0以輸出清單
  • 如果差等於或大於2,添加具有0timestamp1和兩個新的時間戳輸出列表

然後

} // close loop 

和最後的時間戳添加到輸出列表。 (它永遠不會被循環添加)。

請注意,您需要分別處理空輸入列表。

+0

謝謝!我用你的建議來寫我需要的方法!我也發佈了我的代碼。 – user1284267 2012-04-20 09:28:41

0

也許我沒有正確解決您的問題,但你試圖實現至極的機制返回0,如果默認值時間戳不存在?它會更加高效和簡單

0

這個功課是?如果是這樣,請標記爲這樣。

也許我誤解了這個問題,但我會認爲一個簡單的循環應該工作。按時間戳排序列表,然後遍歷所有值。只要找到非連續的時間戳,請插入0條目。

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。