2012-06-02 18 views
29

He oído de utilizar una matriz 2D como esto:2 lista matriz bidimensional

String[][] strArr; 

pero ¿hay alguna manera de hacer esto con una lista?

Quizás algo como esto?

ArrayList<String><String> strList; 

¿Y usar algo como esto para agregarlo?

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

¿Alguna manera de hacer algo como esto? Cualquier ayuda apreciada.

Sería bueno si lo hay porque actualmente estoy colocando cadenas en dos ArrayList diferentes en pares.

Respuesta

65

Se podría utilizar

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

Y luego, cuando sea necesario para agregar un nuevo "fila", deberá añadir la lista:

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

He usado esta mayormente cuando quería para mantener referencias a varias listas de puntos en una GUI para poder dibujar múltiples curvas. Funciona bien.

Por ejemplo:

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

Así que cuando se quiere obtener la cadena desde ella se acaba de utilizar este algo así como lista de listOfLists.getIndex (0) .getIndex (0) ;? – FabianCook

+0

@tskuzzy: gracias! –

+1

@Smart: usaría 'listOfLists.get (index1) .get (index2)' –

9

Una matriz 2D es simplemente una matriz de matrices. El análogo para listas es simplemente un List de List s.

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

Lo admito, no es una solución bonita, especialmente si se trata de una estructura de 3 o más dimensiones.

+0

Puede reemplazar 3 ArrayList de 4 por Lista. – assylias

3

Si su matriz plataforma compatible con Java 7, puede utilizar, como a continuación

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

Actualmente mis plataformas son Android y Windows – FabianCook

+0

Lo que quiero decir por plataforma es "Your Java Env de desarrollo". Parece que estás intentando esto en Android. Pero la pregunta está modificada como java. Incluso en Android, la primera respuesta funcionará. –

+0

Sí, es por eso que lo etiqueté en Java. No está relacionado con Android. Yo uso Eclipse. – FabianCook

11

Se puede crear una lista,

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

y añadir otras listas para que de este modo:

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

Ahora puede usar el doble lazo a continuación para mostrar todo dentro de todas las listas

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

podría describir el fragmento de código por favor? – dhein

2

hecho, 2 matriz bidimensional es la lista de lista de X, donde X es una de las estructuras de datos de los típicos a los definidos por el usuario. Como el siguiente código de instantánea, agregué fila por fila en una matriz triangle. Para crear cada fila, utilicé el método add para agregar elementos manualmente o el método asList para crear una lista a partir de una banda de datos.

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)); 

} 
} 

Ejecución de la muestra, se genera la salida:

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

Así es como para crear e imprimir una matriz 2D multidimensional utilizando el objeto ArrayList.

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

Sé que es una vieja pregunta con buenas respuestas, pero creo que puedo agregar 2 centavos.

La manera más simple y más flexible que funciona para mí es simplemente usar un class2D casi "Plain and Old Java Object" para crear cada "fila" de su matriz.

El siguiente ejemplo tiene algunas explicaciones y es ejecutable (se puede copiar y pegar, pero recuerde que debe comprobar el nombre del paquete):

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; 
    } 
} 

ACTUALIZACIÓN - Para responder a la pregunta de @Mohammed Akhtar Zuberi , He creado la versión simplificada del programa, para que sea más fácil mostrar los resultados.

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; 
    } 

} 

El código anterior produce el resultado siguiente (me encontré en NetBeans):

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

¿Es posible si puedes compartir el resultado? Me refiero a cómo se verá la matriz? –

+0

Hola, Mohammed. He actualizado la respuesta para que quede más clara, en función de su pregunta. Tenga en cuenta que, dado que tenemos una clase que representa cada fila, no es necesario que esté vinculada a un tipo de Java en particular (Entero, Cadena, etc.) –

Cuestiones relacionadas