2016-03-08 57 views
3

我想要此代碼打印Pascal三角形,並且需要將generate()的輸出設置爲List<List<Integer>>我一直在掙扎太多,主要是因爲我不習慣迭代並將值分配給列表的列表。你能幫我解決問題嗎?我不尋找奇特的解決方案!爲Java列表中的列表成員分配值

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class PascalTriangle { 

    public static long biCoeff(int n, int k) { 
     if (n==k) { 
      return (long) 1; 
     } 
     if (n==0) { 
      return (long) n; 
     } 

     return (biCoeff(n-1, k-1)+biCoeff(n-1,k)); 
    } 

    public static List<List<Integer>> generate(int numRows) { 
     List<List<Integer>> l = new ArrayList<>(); 
     for (int i=0; i<numRows; i++) { 
      for (int j=0; j<l.get(i).size(); j++) { 
       l.get(i).add((int) biCoeff(numRows, j)); 
      } 

     } 
     return l; 
    } 


    public static void main(String[] args){ 
     generate(5); 
    } 
} 

錯誤:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
    at java.util.ArrayList.rangeCheck(ArrayList.java:635) 
    at java.util.ArrayList.get(ArrayList.java:411) 
    at PascalTriangle.generate(PascalTriangle.java:25) 
    at PascalTriangle.main(PascalTriangle.java:35) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

Process finished with exit code 1                        

回答

2

嘗試下面的代碼生成方法,包括:

public static List<List<Integer>> generate(int numRows) { 
     List<List<Integer>> l = new ArrayList<List<Integer>>(); 
     for (int i = 0; i < numRows; i++) { 
      l.add(i, new ArrayList<Integer>()); 
      for (int j = 0; j <= i; j++){ 
       l.get(i).add((int) biCoeff(numRows, j)); 
      } 
     } 
     return l; 
    } 

輸出:

[[1], [1, 5], [1, 5, 10], [1, 5, 10, 10], [1, 5, 10, 10, 5]]

可以有其他圖案(在每個行的末端具有1):

import java.util.ArrayList; 
import java.util.List; 

public class Pascal { 
    static List<List<Integer>> l = new ArrayList<List<Integer>>(); 
    public static void main(String[] args) { 
     int noOfRows = 5; 
     int counter = 0; 
     List<Integer> list = new ArrayList<Integer>(); 
     list.add(1); 
     generate(list, counter, noOfRows); 
     System.out.println(l); 
    } 

    public static List<Integer> generate(List<Integer> list, int counter, int noOfRows) { 
     l.add(list); 
     List<Integer> tempList = new ArrayList<Integer>(); 
     tempList.add(1); 
     for (int i = 1; i < list.size(); i++) { 
      tempList.add(list.get(i) + list.get(i - 1)); 
     } 
     tempList.add(1); 
     if (counter != noOfRows) 
      generate(tempList, ++counter, noOfRows); 
     return tempList; 
    } 
} 

輸出:

[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1]]

+0

你知道在每一個結尾打印1的技巧是什麼? –

+0

檢查更新的答案。或者請給我你想要的圖案。 –

4

您必須添加一個List先添加項目。

public static List<List<Integer>> generate(int numRows) { 
    List<List<Integer>> l = new ArrayList<>(); 
    for (int i=0; i<numRows; i++){ 
     l.add(new List<Integer>()); // add this line 
     //l.get(i).add((int) biCoeff(numRows, i)); 
     for (int j=0; j<l.get(i).size(); j++) { 
      l.get(i).add((int) biCoeff(numRows, j)); 
     } 

    } 
    return l; 
} 

其實這個代碼將無法編譯,因爲List是一個接口,你不能創建它的實例。 你將不得不選擇一個實現List的類並使用它來代替new List<Integer>()。例如,new java.util.ArrayList<Integer>()

+0

它說:名單是抽象它不能在該行被實例化,你告訴添加 –

+0

選擇,而不是List'的'實現的一個:例如:'新的java.util.ArrayList ()' – MikeCAT

+0

先初始化列表。 new ArrayList (); –