2012-06-02 81 views
29

我聽說過使用二維數組是這樣的:二維數組列表

String[][] strArr; 

但有一個列表這樣的方法嗎?

也許這樣?

ArrayList<String><String> strList; 

並使用類似這樣的東西來增加它?

strList.add("hey", "hey"); 

任何方式做這樣的事情?任何幫助讚賞。

這將是很好,如果有,因爲我目前把字符串放入兩個不同的ArrayList的成對。

回答

65

你會當你需要添加一個新的「行」使用

List<List<String>> listOfLists = new ArrayList<List<String>>(); 

然後,你要補充名單:

listOfLists.add(new ArrayList<String>()); 

我用這個大多時候想在GUI中保存對幾個Point列表的引用,這樣我可以繪製多條曲線。它運作良好。

例如:

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.RenderingHints; 
import java.awt.Stroke; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class DrawStuff extends JPanel { 
    private static final int PREF_W = 400; 
    private static final int PREF_H = PREF_W; 
    private static final Color POINTS_COLOR = Color.red; 
    private static final Color CURRENT_POINTS_COLOR = Color.blue; 
    private static final Stroke STROKE = new BasicStroke(4f); 
    private List<List<Point>> pointsList = new ArrayList<List<Point>>(); 
    private List<Point> currentPointList = null; 

    public DrawStuff() { 
     MyMouseAdapter myMouseAdapter = new MyMouseAdapter(); 
     addMouseListener(myMouseAdapter); 
     addMouseMotionListener(myMouseAdapter); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setStroke(STROKE); 
     g.setColor(POINTS_COLOR); 
     for (List<Point> pointList : pointsList) { 
     if (pointList.size() > 1) { 
      Point p1 = pointList.get(0); 
      for (int i = 1; i < pointList.size(); i++) { 
       Point p2 = pointList.get(i); 
       int x1 = p1.x; 
       int y1 = p1.y; 
       int x2 = p2.x; 
       int y2 = p2.y; 
       g.drawLine(x1, y1, x2, y2); 
       p1 = p2; 
      } 
     } 
     } 
     g.setColor(CURRENT_POINTS_COLOR); 
     if (currentPointList != null && currentPointList.size() > 1) { 
     Point p1 = currentPointList.get(0); 
     for (int i = 1; i < currentPointList.size(); i++) { 
      Point p2 = currentPointList.get(i); 
      int x1 = p1.x; 
      int y1 = p1.y; 
      int x2 = p2.x; 
      int y2 = p2.y; 
      g.drawLine(x1, y1, x2, y2); 
      p1 = p2; 
     } 
     } 
    } 

    private class MyMouseAdapter extends MouseAdapter { 
     @Override 
     public void mousePressed(MouseEvent mEvt) { 
     currentPointList = new ArrayList<Point>(); 
     currentPointList.add(mEvt.getPoint()); 
     repaint(); 
     } 

     @Override 
     public void mouseDragged(MouseEvent mEvt) { 
     currentPointList.add(mEvt.getPoint()); 
     repaint(); 
     } 

     @Override 
     public void mouseReleased(MouseEvent mEvt) { 
     currentPointList.add(mEvt.getPoint()); 
     pointsList.add(currentPointList); 
     currentPointList = null; 
     repaint(); 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("DrawStuff"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new DrawStuff()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

所以(0).getIndex(0);? – FabianCook

+0

@tskuzzy:謝謝! –

+1

@Smart:你會使用'listOfLists.get(索引1)獲得(索引2)' –

9

2D陣列僅僅是一個數組的數組。列表的模擬只是ListList s。

ArrayList<ArrayList<String>> myList = new ArrayList<ArrayList<String>>(); 

我承認,這不是一個漂亮的解決方案,尤其是如果你去一個3維或更多的維度結構。

+0

你可以用List替換3個ArrayList中的4個。 – assylias

3

如果你的平臺矩陣支持Java 7,那麼你可以使用如下

List<List<String>> myList = new ArrayList<>(); 
+0

目前我的平臺是Android和Windows – FabianCook

+0

兩個我的意思平臺是「你的Java開發ENV」。它看起來像你在Android上試圖這樣。但是問題被定義爲java。即使在android中,第一個答案也會起作用。 –

+0

這就是爲什麼我用java標記它。它與Android幾乎沒有關係。我使用Eclipse。 – FabianCook

11

您可以創建一個列表,

ArrayList<String[]> outerArr = new ArrayList<String[]>(); 

並添加其他列表,以它像這樣:

String[] myString1= {"hey","hey","hey","hey"}; 
outerArr .add(myString1); 
String[] myString2= {"you","you","you","you"}; 
outerArr .add(myString2); 

現在您可以使用下面的雙循環顯示所有列表中的所有內容

for(int i=0;i<outerArr.size();i++){ 

    String[] myString= new String[4]; 
    myString=outerArr.get(i); 
    for(int j=0;j<myString.length;j++){ 
     System.out.print(myString[j]); 
    } 
    System.out.print("\n"); 

} 
+0

你能描述一下代碼段嗎? – dhein

2

逸岸,2維陣列是X列表,其中X是從代表性的用戶定義的那些數據結構中的一個的列表。如下面的快照代碼,我逐行添加到數組triangle。爲了創建每一行,我使用方法add手動添加元素或使用方法asList從一個數據段創建一個列表。

package algorithms; 

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

public class RunDemo { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // Get n 
    List<List<Integer>> triangle = new ArrayList<List<Integer>>(); 

    List<Integer> row1 = new ArrayList<Integer>(1); 
    row1.add(2); 
    triangle.add(row1); 

    List<Integer> row2 = new ArrayList<Integer>(2); 
    row2.add(3);row2.add(4); 
    triangle.add(row2); 

    triangle.add(Arrays.asList(6,5,7)); 
    triangle.add(Arrays.asList(4,1,8,3)); 

    System.out.println("Size = "+ triangle.size()); 
    for (int i=0; i<triangle.size();i++) 
     System.out.println(triangle.get(i)); 

} 
} 

運行示例,它的輸出:

Size = 4 
[2] 
[3, 4] 
[6, 5, 7] 
[4, 1, 8, 3] 
0

下面是如何製造和使用ArrayList對象打印2D多維數組。

import java.util.ArrayList; 

public class TwoD_ArrayListExample { 
    static public ArrayList<ArrayList<String>> gameBoard = new ArrayList<ArrayList<String>>(); 

    public static void main(String[] args) { 
     insertObjects(); 
     printTable(gameBoard); 
    } 

    public static void insertObjects() { 
     for (int rowNum = 0; rowNum != 8; rowNum++) { 
      ArrayList<String> oneRow = new ArrayList<String>(); 
      gameBoard.add(rowNum, oneRow); 

      for (int columnNum = 0; columnNum != 8; columnNum++) { 
       String description= "Description of Objects: row= "+ rowNum + ", column= "+ columnNum; 
        oneRow.add(columnNum, description); 
      } 
     } 
    } 

    // The printTable method prints the table to the console 
    private static void printTable(ArrayList<ArrayList<String>> table) { 
     for (int row = 0; row != 8; row++) { 
      for (int col = 0; col != 8; col++) { 
       System.out.println("Printing:    row= "+ row+ ", column= "+ col); 
       System.out.println(table.get(row).get(col).toString()); 
      } 
     } 
     System.out.println("\n"); 
    } 
} 
1

我知道這是一個很好的答案,但我相信我可以增加我的2美分。

這對我的作品最簡單和最靈活的方式是隻用一個幾乎是「平原舊Java對象」 class2D創建每個陣列的「行」。

下面的例子具有一定的解釋,是可執行文件(你可以複製和粘貼,但記得要檢查包名):

package my2darraylist; 

import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JPanel; 

public class My2DArrayList 
{ 
    public static void main(String[] args) 
    { 
     // This is your "2D" ArrayList 
     // 
     List<Box> boxes = new ArrayList<>(); 

     // Add your stuff 
     // 
     Box stuff = new Box(); 
     stuff.setAString("This is my stuff"); 
     stuff.addString("My Stuff 01"); 
     stuff.addInteger(1); 
     boxes.add(stuff); 

     // Add other stuff 
     // 
     Box otherStuff = new Box(); 
     otherStuff.setAString("This is my other stuff"); 
     otherStuff.addString("My Other Stuff 01"); 
     otherStuff.addInteger(1); 
     otherStuff.addString("My Other Stuff 02"); 
     otherStuff.addInteger(2); 
     boxes.add(otherStuff); 

     // List the whole thing 
     for (Box box : boxes) 
     { 
      System.out.println(box.getAString()); 
      System.out.println(box.getMyStrings().size()); 
      System.out.println(box.getMyIntegers().size()); 
     } 
    } 

} 

class Box 
{ 
    // Each attribute is a "Column" in you array 
    //  
    private String aString; 
    private List<String> myStrings = new ArrayList<>() ; 
    private List<Integer> myIntegers = new ArrayList<>(); 
    // Use your imagination... 
    // 
    private JPanel jpanel; 

    public void addString(String s) 
    { 
     myStrings.add(s); 
    } 

    public void addInteger(int i) 
    { 
     myIntegers.add(i); 
    } 

    // Getters & Setters 

    public String getAString() 
    { 
     return aString; 
    } 

    public void setAString(String aString) 
    { 
     this.aString = aString; 
    } 

    public List<String> getMyStrings() 
    { 
     return myStrings; 
    } 

    public void setMyStrings(List<String> myStrings) 
    { 
     this.myStrings = myStrings; 
    } 

    public List<Integer> getMyIntegers() 
    { 
     return myIntegers; 
    } 

    public void setMyIntegers(List<Integer> myIntegers) 
    { 
     this.myIntegers = myIntegers; 
    } 

    public JPanel getJpanel() 
    { 
     return jpanel; 
    } 

    public void setJpanel(JPanel jpanel) 
    { 
     this.jpanel = jpanel; 
    } 
} 

UPDATE - 要回答@Mohammed阿赫塔爾Zuberi問題,我創建了該程序的簡化版本,以便更容易地顯示結果。

import java.util.ArrayList; 

public class My2DArrayListSimplified 
{ 

    public static void main(String[] args) 
    { 
     ArrayList<Row> rows = new ArrayList<>(); 
     Row row; 
     // Insert the columns for each row 
     //    First Name, Last Name, Age 
     row = new Row("John",  "Doe",  30); 
     rows.add(row); 
     row = new Row("Jane",  "Doe",  29); 
     rows.add(row); 
     row = new Row("Mary",  "Doe",  1); 
     rows.add(row); 

     // Show the Array 
     // 
     System.out.println("First\t Last\tAge"); 
     System.out.println("----------------------"); 
     for (Row printRow : rows) 
     { 
      System.out.println(
        printRow.getFirstName() + "\t " + 
        printRow.getLastName() + "\t" + 
        printRow.getAge()); 

     } 
    } 

} 

class Row 
{ 

    // REMEMBER: each attribute is a column 
    // 
    private final String firstName; 
    private final String lastName; 
    private final int age; 

    public Row(String firstName, String lastName, int age) 
    { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.age = age; 
    } 

    public String getFirstName() 
    { 
     return firstName; 
    } 

    public String getLastName() 
    { 
     return lastName; 
    } 

    public int getAge() 
    { 
     return age; 
    } 

} 

上面的代碼產生以下結果(我跑了它的NetBeans):當你想從它的字符串,你只想用這種類似listOfLists.getIndex的列表

run: 
First Last Age 
---------------------- 
John  Doe 30 
Jane  Doe 29 
Mary  Doe 1 
BUILD SUCCESSFUL (total time: 0 seconds) 
+0

如果你能分享結果,可能嗎?我的意思是陣列看起來如何? –

+0

嗨,穆罕默德。根據你的問題,我已經更新了答案以使其更清楚。請注意,由於我們有代表每一行的類,因此我們不需要綁定到特定的Java類型(整數,字符串等) –