Trabajar con una Lista de Listas en Java

Estoy tratando de leer un archivo CSV en una lista de listas (de cadenas), que pasan a su alrededor para obtener algunos datos de una base de datos, crear una nueva lista de listas de nuevos datos, a continuación, pasar lista de listas, de modo que se puedan escribir en un nuevo archivo CSV. He visto de todo, y me parece que no puede encontrar un ejemplo de cómo hacerlo.

Yo prefiero no usar matrices sencillas debido a que los archivos pueden variar en tamaño, y no voy a saber qué usar para las dimensiones de las matrices. Yo no tengo los problemas relacionados con los archivos. No estoy seguro de cómo tratar con la lista de las listas.

La mayoría de los ejemplos que me he encontrado va a crear matrices multidimensionales o realizar acciones dentro del bucle que lee los datos desde el archivo. Sé que puedo hacerlo, pero quiero escribir orientado a objetos de código. Si usted puede proporcionar el código de ejemplo o punto de mí una referencia, que sería genial.

InformationsquelleAutor | 2009-09-25

8 Kommentare

  1. 135
    ArrayList<ArrayList<String>> listOLists = new ArrayList<ArrayList<String>>();
    ArrayList<String> singleList = new ArrayList<String>();
    singleList.add("hello");
    singleList.add("world");
    listOLists.add(singleList);
    
    ArrayList<String> anotherList = new ArrayList<String>();
    anotherList.add("this is another list");
    listOLists.add(anotherList);
  2. 15

    Si son realmente como para saber que manejar archivos CSV perfectamente en Java, no es bueno tratar de implementar CSV lector/escritor por sí mismo. Verificación de abajo.

    http://opencsv.sourceforge.net/

    Cuando el documento CSV incluye comillas dobles o saltos de línea, que se enfrentan a dificultades.

    Para aprender enfoque orientado a objetos en primer lugar, ver a otra aplicación (Java) le ayudará. Y creo que no es buena manera de administrar una fila en una Lista. CSV no te permiten tener la diferencia de tamaño de las columnas.

    • +1 por lo que sugiere OpenCSV. Sin embargo, la se bien prueba para implementar CSV lector / escritor de sí mismo, especialmente para java novato – a aprender un montón de cosas a lo largo del camino.
  3. 11

    Aquí un ejemplo en el que se lee una lista de CSV cadenas en una lista de listas y, a continuación, recorre la lista de listas de e imprime el CSV cadenas de regreso a la consola.

    import java.util.ArrayList;
    import java.util.List;
    
    public class ListExample
    {
        public static void main(final String[] args)
        {
            //sample CSV strings...pretend they came from a file
            String[] csvStrings = new String[] {
                    "abc,def,ghi,jkl,mno",
                    "pqr,stu,vwx,yz",
                    "123,345,678,90"
            };
    
            List<List<String>> csvList = new ArrayList<List<String>>();
    
            //pretend you're looping through lines in a file here
            for(String line : csvStrings)
            {
                String[] linePieces = line.split(",");
                List<String> csvPieces = new ArrayList<String>(linePieces.length);
                for(String piece : linePieces)
                {
                    csvPieces.add(piece);
                }
                csvList.add(csvPieces);
            }
    
            //write the CSV back out to the console
            for(List<String> csv : csvList)
            {
                //dumb logic to place the commas correctly
                if(!csv.isEmpty())
                {
                    System.out.print(csv.get(0));
                    for(int i=1; i < csv.size(); i++)
                    {
                        System.out.print("," + csv.get(i));
                    }
                }
                System.out.print("\n");
            }
        }
    }

    Bastante sencillo, creo. Sólo un par de puntos a aviso:

    1. Recomiendo el uso de «Lista» en lugar de «ArrayList» en el lado izquierdo a la hora de crear objetos de la lista. Es mejor pasar por la interfaz «Lista», porque entonces si más tarde usted deberá cambiar el uso de algo como Vector (por ejemplo, ahora se necesita listas sincronizadas), sólo tiene que cambiar la línea con el «nuevo» estado. No importa lo que la aplicación de la lista de utilizar, por ejemplo, un Vector o una ArrayList, que siempre acaba de pasar alrededor de List<String>.

    2. En el ArrayList constructor, usted puede salir de la lista vacía y se pondrá por defecto a un tamaño determinado y, a continuación, crecer dinámicamente según sea necesario. Pero si usted sabe el tamaño de su lista podría ser, que a veces puede ahorrar algo de rendimiento. Por ejemplo, si usted sabía que había siempre va a ser de 500 líneas en su archivo, a continuación, usted podría hacer:

    List<List<String>> csvList = new ArrayList<List<String>>(500);

    De esa manera usted nunca procesamiento de desechos de tiempo de espera para su lista para crecer dinámicamente crecer. Esta es la razón por la que me pase «linePieces.longitud» para el constructor. No suele ser un gran problema, pero útil a veces.

    Espero que ayude!

    • Su ejemplo, mientras más detallado, también es bastante engañoso. Lectura de archivo CSV línea por línea, y la división de líneas en coma, sin sentido, para las citas es buscar problemas.
    • Estoy de acuerdo con usted y todos los demás sobre CSV no es tan simple como dividir en comas. Tengo la impresión de que el quid de la cuestión era demostrar cómo el uso de los medicamentos genéricos & listas de listas, no analizar CSV. Me gusta OpenCSV como un paquete, así que definitivamente estoy de acuerdo con usted y todos los demás y recomendar algo así como que para el análisis de las líneas. Gracias por los comentarios!
    • List<List<String>> csvList = new ArrayList<List<String>>(500) no crear un fijo de la lista.
  4. 5

    El ejemplo proporcionado por @tster muestra cómo crear una lista de la lista. Voy a dar un ejemplo para iterar sobre una lista.

    Iterator<List<String>> iter = listOlist.iterator();
    while(iter.hasNext()){
        Iterator<String> siter = iter.next().iterator();
        while(siter.hasNext()){
             String s = siter.next();
             System.out.println(s);
         }
    }
  5. 3

    Algo como esto iba a funcionar para la lectura:

    String filename = "something.csv";
    BufferedReader input = null;
    List<List<String>> csvData = new ArrayList<List<String>>();
    try 
    {
        input =  new BufferedReader(new FileReader(filename));
        String line = null;
        while (( line = input.readLine()) != null)
        {
            String[] data = line.split(",");
            csvData.add(Arrays.toList(data));
        }
    }
    catch (Exception ex)
    {
          ex.printStackTrace();
    }
    finally 
    {
        if(input != null)
        {
            input.close();
        }
    }
  6. 2

    Me gustaría segundo lo xrath dijo: – es mejor que use una biblioteca existente para manejar la lectura /escritura de CSV.

    Si usted planea lanzar su propio framework, yo también sugieren no usar List<List<String>> como su aplicación – que probablemente estaría mejor fuera de la aplicación de CSVDocument y CSVRow clases (que puede que internamente utiliza un List<CSVRow> o List<String> respectivamente), aunque para los usuarios, sólo exponer una inmutable Lista o una matriz.

    Simplemente utilizando List<List<String>> deja demasiadas desactivada casos de borde y de confiar en los detalles de implementación – como son los encabezados almacenados por separado de los datos? o están en la primera fila de la List<List<String>>? Lo que si quiero que el acceso a los datos de encabezado de columna de la fila en lugar de por el índice?

    lo que sucede cuando usted llama cosas como :

    //reads CSV data, 5 rows, 5 columns 
    List<List<String>> csvData = readCSVData(); 
    csvData.get(1).add("extraDataAfterColumn"); 
    //now row 1 has a value in (nonexistant) column 6
    csvData.get(2).remove(3); 
    //values in columns 4 and 5 moved to columns 3 and 4, 
    //attempting to access column 5 now throws an IndexOutOfBoundsException.

    Usted podría intentar validar todo esto al escribir el archivo CSV, y esto puede funcionar en algunos casos… pero en otros, tendrás que alerta al usuario de una excepción lejos de donde el cambio erróneo se hizo, resultando difícil la depuración.

  7. 0

    También este es un ejemplo de cómo imprimir la lista de la Lista, utilizando avanzadas bucle for:

    public static void main(String[] args){
            int[] a={1,3, 7, 8, 3, 9, 2, 4, 10};
            List<List<Integer>> triplets;
            triplets=sumOfThreeNaive(a, 13);
            for (List<Integer> list : triplets){
                for (int triplet: list){
                    System.out.print(triplet+" ");
                }
                System.out.println();
            }
        }
  8. 0
     public class TEst {
    
        public static void main(String[] args) {
    
            List<Integer> ls=new ArrayList<>();
            ls.add(1);
            ls.add(2);
            List<Integer> ls1=new ArrayList<>();
            ls1.add(3);
            ls1.add(4);
            List<List<Integer>> ls2=new ArrayList<>();
            ls2.add(ls);
            ls2.add(ls1);
    
            List<List<List<Integer>>> ls3=new ArrayList<>();
            ls3.add(ls2);
    
    
            methodRecursion(ls3);
        }
    
        private static void methodRecursion(List ls3) {
            for(Object ls4:ls3)
            {
                 if(ls4 instanceof List)    
                 {
                    methodRecursion((List)ls4);
                 }else {
                     System.out.print(ls4);
                 }
    
            }
        }
    
    }
    • Mientras que este código puede resolver la cuestión, , incluyendo una explicación de de cómo y por qué esto resuelve el problema realmente podría ayudar a mejorar la calidad de tu post, y el resultado probablemente más votos. Recuerde que usted está respondiendo a la pregunta para los lectores en el futuro, no sólo a la persona preguntando ahora. Por favor, editar su respuesta a añadir explicaciones y dar una indicación de lo que las limitaciones y supuestos que se aplican.
    • La recursividad es utilizado para la recuperación de lista anidada

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...