2016-01-28 11 views
1

我從服務器獲取數據並將其緩存在linked list中。收到數據後,我將其分配給本地的timestamp,以便我LinkedList中的每個元素都具有timestamp屬性。現在我想從緩衝區讀出一段時間的數據。如何在給定的開始日期和結束日期時間之間在鏈接列表中獲取DateTime元素的範圍

例如從28.01.2016 08:44:00到28.01.2016 08:45:00 1分鐘的所有元素。

我該怎麼辦?我會非常感謝您的建議或代碼示例。

+2

會不會有什麼錯從一開始就走在名單上,直到你到達開始時間,然後閱讀數據,直到你達到結束時間?假設你按照時間順序插入時間戳,這應該起作用。 –

回答

0

JAVA 8:

public class TimeInListTest { 
    public static void main(String[] args) throws ParseException { 
     DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); 

     List<Element> list = new LinkedList<>(); 
     list.add(new Element(dateFormat.parse("28.01.2016 08:43:00 "))); 
     list.add(new Element(dateFormat.parse("28.01.2016 08:43:05 "))); 
     list.add(new Element(dateFormat.parse("28.01.2016 08:44:00 "))); 
     list.add(new Element(dateFormat.parse("28.01.2016 08:44:30 "))); 
     list.add(new Element(dateFormat.parse("28.01.2016 08:44:35 "))); 
     list.add(new Element(dateFormat.parse("28.01.2016 08:44:38 "))); 
     list.add(new Element(dateFormat.parse("28.01.2016 08:45:00 "))); 
     list.add(new Element(dateFormat.parse("28.01.2016 08:46:00 "))); 

     Date leftLimit = dateFormat.parse("28.01.2016 08:44:00"); 
     Date rightLimit = dateFormat.parse("28.01.2016 08:45:00"); 

     System.out.println(list.stream().filter(element -> element.date.after(leftLimit) && element.date.before(rightLimit)).collect(Collectors.toList())); 
    } 

    static class Element { 
     Date date; 
     String someData; 

     public Element() { 
     } 

     public Element(Date date) { 
      this.date = date; 
     } 

     public Date getDate() { 
      return date; 
     } 

     public void setDate(Date date) { 
      this.date = date; 
     } 

     @Override 
     public String toString() { 
      return "Element{" + 
        "date=" + date + 
        '}'; 
     } 
    } 
} 

JAVA 7(取代的λ):

List<Element> resultList = new LinkedList<>(); 

     for (Element element: list) { 
      if (element.date.after(leftLimit) && element.date.before(rightLimit)) { 
       resultList.add(element); 
      } 
     } 

     System.out.println(resultList); 

結果:

[元素{日期=星期四08年1月28日: 44:30 MSK 2016},元素{date = Thu Jan 28 08:44:35 MSK 2016},元素{日期=週四1月28日8點44分38秒MSK 2016}]

+0

作爲salamu alaykum! U menya vot takoy錯誤按摩(「令牌上的語法錯誤」),ElidedSemicolonAndRightBrace預計「)vsplyvaet。 K sozhaleniyu,mne語法Java 8 ne znakom。珏MNE pravil'nee VOT ETU tvoyu stroku(「tmpBuffer.stream()濾波器(元件 - > element.date.after(leftLimit)&& element.date.before(rightLimit))收集(Collectors.toList())) ;「)v Java 7 implementationmentirovat'? –

+0

УааляйкумассалямуарахматуЛлахиуабаракатуху。 Брат,обратитевниманиенакодподзаголовком 「JAVA 7(取代拉姆達)」 - именноэтимкодомнужнозаменитьупомянутуювамистроку。 – DmitryKanunnikoff

+0

Barakallah1u fikum,brat! –

0

的Java 8實現:

import java.time.LocalDateTime; 
import java.time.format.DateTimeFormatter; 
import java.util.AbstractMap; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Map; 
import java.util.stream.Collectors; 

public class T35055579 { 
    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_DATE_TIME; 

    public static void main(String[] args) { 
     LinkedList<Map.Entry<String, LocalDateTime>> data = new LinkedList<>(); 
     LocalDateTime start = LocalDateTime.parse("2016-01-28T08:43:50", DATE_TIME_FORMATTER); 
     for (int i = 0; i < 10; i++) { 
      data.add(wrap(String.valueOf(i), start.plusSeconds(i * 11))); 
     } 
     System.out.println("Full list:"); 
     print(data); 
     String from = "2016-01-28T08:44:00"; 
     String to = "2016-01-28T08:45:00"; 
     System.out.println(String.format("Values between [%s, %s]:", from, to)); 
     print(filter(data, from, to)); 
    } 

    private static List<Map.Entry<String, LocalDateTime>> filter(LinkedList<Map.Entry<String, LocalDateTime>> data, String fromRaw, String toRaw) { 
     LocalDateTime from = LocalDateTime.parse(fromRaw, DATE_TIME_FORMATTER); 
     LocalDateTime to = LocalDateTime.parse(toRaw, DATE_TIME_FORMATTER); 
     return data.stream() 
       .filter(d -> between(d.getValue(), from, to)) 
       .collect(Collectors.toList()); 
    } 

    private static boolean between(LocalDateTime value, LocalDateTime from, LocalDateTime to) { 
     return (value.isAfter(from) || value.isEqual(from)) && 
       (value.isBefore(to) || value.isEqual(to)); 
    } 


    private static void print(List<Map.Entry<String, LocalDateTime>> data) { 
     data.forEach(System.out::println); 
    } 

    private static Map.Entry<String, LocalDateTime> wrap(String value, LocalDateTime time) { 
     return new AbstractMap.SimpleEntry<>(value, time); 
    } 
} 

結果:

Full list: 
0=2016-01-28T08:43:50 
1=2016-01-28T08:44:01 
2=2016-01-28T08:44:12 
3=2016-01-28T08:44:23 
4=2016-01-28T08:44:34 
5=2016-01-28T08:44:45 
6=2016-01-28T08:44:56 
7=2016-01-28T08:45:07 
8=2016-01-28T08:45:18 
9=2016-01-28T08:45:29 

Values between [2016-01-28T08:44:00, 2016-01-28T08:45:00]: 
1=2016-01-28T08:44:01 
2=2016-01-28T08:44:12 
3=2016-01-28T08:44:23 
4=2016-01-28T08:44:34 
5=2016-01-28T08:44:45 
6=2016-01-28T08:44:56 
相關問題