2012-03-01 125 views
0

我真的是新來的java和慢慢學習,所以不知道是否有一個明顯的方法來做到這一點,但我基本上有兩個列表,我想合併在一起,形成一個單子。如何創建合併其他兩個列表的列表?

爲此的Python代碼使用稱爲zip的函數。假設我有list1 = 1,2,3,4,5list2= 6,7,8,9,10 ..然後我想用new_list = (1,6), (2,7), (3,8), (4,9), (5,10)這樣的東西創建一個新列表。

我發現有一個question有類似的問題,但我不想使用外部庫,而寧願學習如何自己創建此功能。

+1

最好的學習方法是嘗試自己做。我建議你寫一個幫助器方法(你可以稱它爲「zip」;) – 2012-03-01 15:46:01

+1

同時迭代兩個列表,並從每個相同的偏移量創建一個對,然後將這個對放在一個新列表中。 – 2012-03-01 15:46:17

+0

「學習如何自己創建此功能」,通過詢問如何在Stackoverflow上執行此操作? – Gray 2012-03-01 16:35:12

回答

1

廣義的算法會是這個樣子(假設你要取N輸入列表):

public <T> List<List<T>> zip(List<T> ... lists) { 

    if(lists.isEmpty()) { 
     return Collections.<List<T>>emptyList(); 
    } 

    // validate that the input lists are all the same size. 
    int numItems = lists[0].size(); 
    for(int i = 1; i < lists.length; i++) { 
     if(lists[i].size() != numItems) { 
      throw new IllegalArgumentException("non-uniform-length list at index " + i); 
     } 
    } 

    List<List<T>> result = new ArrayList<List<T>>(); 

    for(int i = 0; i < numItems; i++) { 

     // create a tuple of the i-th entries of each list 
     List<T> tuple = new ArrayList<T>(lists.length); 
     for(List<T> list : lists) { 
      tuple.add(list.get(i)); 
     } 

     // add the tuple to the result 
     result.add(tuple); 
    } 

    return result; 
} 
+0

如果'lists'中的列表中有一個元素與另一個列表中的元素較少,則您的代碼可以拋出'IndexOutOfBoundsException'。 – 2012-03-01 15:52:33

+0

我大多是懶惰的,而不是寫錯誤檢查邏輯。 :)我喜歡積極地進行驗證,所以我會在開始時進行快速檢查(特別是因爲我使用第一個列表的大小作爲循環條件)。 – stevevls 2012-03-01 15:54:43

1
public class Blammy 
{ 
    private String left; 
    private String right; 

    public Blammy(final String left, final String right) 
    { 
     this.left = left; 
     this.right = right; 
    } 

    public String toString() 
    { 
     return "(" + left + ", " + right + ")"; 
    } 
} 

public class Kramlish 
{ 
    public List<Blammy> mergalish(final List<String> left, final List<String> right) 
    { 
     int leftSize; 
     int maxSize; 
     int rightSize; 
     String leftValue; 
     List<Blammy> returnValue; 
     String rightValue; 

     if (left != null) 
     { 
      leftSize = left.size(); 
     } 
     else 
     { 
      leftSize = 0; 
     } 

     if (right != null) 
     { 
      rightSize = right.size(); 
     } 
     else 
     { 
      rightSize = 0; 
     } 

     if (leftSize > rightSize) 
     { 
      maxSize = leftSize; 
     } 
     else 
     { 
      maxSize = rightSize; 
     } 

     if (maxSize > 0) 
     { 
      returnValue = new ArrayList<Blammy>(maxSize); 

      for (int index = 0; index < maxSize; ++index) 
      { 
       if (index < leftSize) 
       { 
        leftValue = left.get(index); 
       } 
       else 
       { 
        leftValue = null; 
       } 

       if (index < rightSize) 
       { 
        rightValue = right.get(index); 
       } 
       else 
       { 
        rightValue = null; 
       } 

       Blammy item = new Blammy(leftValue, rightValue); 
       returnValue.add(item); 
      } 
     } 
     else 
     { 
      returnValue = new ArrayList<Blammy>(); 
     } 

     return returnValue; 
    } 
}