2017-10-12 57 views
0

這裏是場景,在我的源列表中,它包含所有Users對象。每個用戶對象將有ideventtimestamp。我需要創建一個目標列表來包含所有具有每個id的最新時間戳記錄的用戶對象。像下面的例子Java - 將數據從一個列表傳輸到另一個列表

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
import com.vincent.object.User; 

public class Test { 
    public static void main(String[] args) throws Exception { 
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    User u1 = new User("1", "55", dateFormat.parse("2017-10-01 10:11:01.111")); 
    User u2 = new User("1", "105", dateFormat.parse("2017-10-01 10:11:02.111")); 
    User u3 = new User("2", "55", dateFormat.parse("2017-10-01 10:11:03.111")); 
    List<User> sources = new ArrayList<>(); 
    sources.add(u1); 
    sources.add(u2); 
    sources.add(u3); 

    List<User> destination = new ArrayList<>(); 
    // I want my destination array only contains following 2 result: 
    // u2 and u3 from the source 
    } 
} 

我該怎麼辦?

編輯:這裏是User類

import java.util.Date; 

public class User { 
    private String id; 
    private String reason; 
    private Date date; 

    public User(String id, String reason, Date date) { 
    super(); 
    this.id = id; 
    this.reason = reason; 
    this.date = date; 
    } 
    // getter setter 
} 
+0

如果我看了這個問題,用戶「1」的最新日期和用戶「2」。一些流操作? –

+0

你好,文森特你是指在另一個列表中保存一個列表?你不能只是在添加和添加一個條件來檢查列表中的內容是否通過使用相同的存儲源列表!Collections.disjoint(list1,list2);或正常等於方法list1.equals(list2); – Pradeep

+0

以下是使用有狀態過濾器謂詞的流的問題:https://stackoverflow.com/questions/23699371/java-8-distinct-by-property –

回答

3

您可以使用Java 8流這一點。

public class Test { 
    public static void main(String[] args) throws Exception { 
     DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
     User u1 = new User("1", "55", dateFormat.parse("2017-10-01 10:11:01.111")); 
     User u2 = new User("1", "105", dateFormat.parse("2017-10-01 10:11:02.111")); 
     User u3 = new User("2", "55", dateFormat.parse("2017-10-01 10:11:03.111")); 
     User u4 = new User("2", "105", dateFormat.parse("2017-10-01 10:11:04.111")); 
     List<User> sources = new ArrayList<>(); 
     sources.add(u1); 
     sources.add(u2); 
     sources.add(u3); 
     sources.add(u4); 


     List<User> destination = sources.stream() 
       .collect(Collectors.groupingBy(User::getId, Collectors.maxBy(Comparator.comparing(User::getDate)))) 
       .values() 
        .stream() 
        .map(o -> o.get()) 
        .collect(Collectors.toList()); 

     System.out.println(destination); 
    } 
} 

這裏是Ids的gruping,獲取用戶max的日期。

輸出(顯然覆蓋上的用戶類的toString):

[用戶{ID = '1',原因= '105',日期=太陽10月1日10時11分02秒BOT 2017},
用戶{id ='2',原因='105',日期= Sun Oct 01 10:11:04 BOT 2017}]

0

我假設你並不需要保存用戶的訂單,因爲它是在源列表。 的想法如下:

  • 遍歷源列表
  • 添加的每個用戶在地圖中,如果它是不存在,更新用戶如果存儲在一個有時間戳比當前更低的(假設如果兩個用戶具有相同的ID,則兩個用戶相等)
  • 返回地圖的密鑰集。

    public static void main(String[] args) 
    { 
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
        User u1 = new User("1", "55", dateFormat.parse("2017-10-01 10:11:01.111")); 
        User u2 = new User("1", "105", dateFormat.parse("2017-10-01 10:11:02.111")); 
        User u3 = new User("2", "55", dateFormat.parse("2017-10-01 10:11:03.111")); 
        List<User> sources = new ArrayList<>(); 
        sources.add(u1); 
        sources.add(u2); 
        sources.add(u3); 
    
        Set<User> uniqUsers = new HashSet<>(); 
        for(User u : sources) 
        { 
         if(uniqUsers.containsKey(u)) 
         { 
          User oldUser = uniqUsers.get(u); 
          long oldTimeStamp = uniqUsers.get(u).getDate().getTime(); 
          long currentTimeStamp = u.getDate().getTime(); 
          if(currentTimeStamp > oldTimeStamp) 
           uniqUsers.remove(oldUser); 
          uniqUsers.add(u); 
         } 
         } 
         List<User> destination = new ArrayList<>(uniqUsers); 
    
    } 
    

用戶類必須以這種方式進行修改(爲了與HashSet的正常工作。

public class User 
{ 
    private String id; 
    private String reason; 
    private Date date; 

    public User(String id, String reason, Date date) 
    { 
     super(); 
     this.id = id; 
     this.reason = reason; 
     this.date = date; 
    } 
    // getter setter 


    @Override 
    public int hashCode() 
    { 
     return id.hashCode(); 
    } 

    @Override 
    public boolean equals(Object obj) 
    { 
     return obj instanceof User && ((User) obj).id.equals(id); 
    } 
} 
+0

如果您想按照某些註釋中的建議使用流,則始終可以應用實現HashSet邏輯的篩選器。另一種解決方案可能是按日期對數組進行排序('Collections.sort(sources,Comparator.comparingInt(u - > u.getDate()。getTime())');然後從右向左迭代,只保留每個用戶你第一次見到他。 –

相關問題