2015-09-10 61 views
-1

嗨,我現在正在使用Guava的Lists.partition方法將一組給定的UUID分割成單獨的子列表。這裏是我的代碼目前:Java Lists.partition無法正常工作

public static List<List<UUID>> splitPlayers(Set<UUID> players, int numTeams) { 
    List<UUID> playerList = new ArrayList<>(players); 
    int partitionSize = players.size()/numTeams; 

    Collections.shuffle(playerList); 

    return Lists.partition(playerList, partitionSize); 
} 

問題是,這並不總是如何我想要的。

需要明確的是,這是我想要的工作:

您提供了一組UUID的,並且指定要爲主,集拆分成(numTeams)的多少子列表。基於此,該方法應該將Set分割成numTeams數量的子列表,而不是將多個或更少的子列表分配給給定的numTeams。

事情是,它不這樣工作。下面是如何它無法正確目前的工作的一個示例:代替

  1. 傳遞含有5個UUID元件的方法的集具有2
  2. 該方法返回含有3子列表的列表的numTeams,預計2.

我有一種感覺,解決這將需要我在計算partitionSize執行一些額外的邏輯。唯一的是我不知道如何做到這一點。

任何幫助將不勝感激。提前致謝。

回答

3

Lists.partition工作正常 - 這只是你不是使用它正確。你有一個四捨五入的問題,基本上:5/2評估爲2,所以你要求的分區大小爲2 ...所以你得到3個分區。您實際上需要3的分區大小,以便您可以將所有團隊分成兩個分區。您需要將分區大小向上舍入爲,以便numTeams * size >= players.size()

這樣做是除法之前只加numTeams - 1的最簡單的方法:

int partitionSize = (players.size() + numTeams - 1)/numTeams; 
+0

非常感謝您! – Luke