Struktury wielowymiarowe

Struktury wielowymiarowe
Noran
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:42
0

Cześć.

Czy w javie są jakieś struktury wielowymiarowe, dla niewiadomej ilości danych? Dajmy na to - pierwszy wiersz n liczb, drugi k liczb, a trzeci m liczb. Najodpowiedniejsze byłoby coś w rodzaju dwuwymiarowego ArrayList.

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:37 minut
1

Lista list list list list ..... list? List<List<List<Integer>>> listaListList = new ArrayList<List<List<Integer>>>(); Potem oczywiście wypełnianie kolejnych poziomów zagnieżdżeń.

Nota bene: Java udostępnia wielowymiarowe tablice i mogą one być "poszarpane" tzn wiersze mogą mieć różne długości. Tak więc do wyboru, do koloru.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
Noran
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:42
0

Mógłbyś zademonstrować w jaki sposób umieszczać elementy oraz odczytywać dane z takiej Listy?

Już sobie poradziłem:

Kopiuj
 import java.util.ArrayList;  
public class md{  
   public static void main(String args[]){  
      ArrayList matrix = new ArrayList();  
      matrix.add(new ArrayList());  
      ((ArrayList)matrix.get(0)).add("row 0 col 0");  
      ((ArrayList)matrix.get(0)).add("row 0 col 1");  
      matrix.add(new ArrayList());  
      ((ArrayList)matrix.get(1)).add("row 1 col 0");  
      ((ArrayList)matrix.get(1)).add("row 1 col 1");  
      int i = 0;  
      int j = 0;  
      // display contents of matrix  
      for(i = 0; i < matrix.size();i++){  
         for(j = 0; j < ((ArrayList)matrix.get(i)).size(); j++){  
            System.out.print( (String)((ArrayList)matrix.get(i)).get(j) +"  ");  
         }  
         System.out.println();  
      }  
   }  
}  
edytowany 2x, ostatnio: Noran
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:37 minut
1

Normalnie powinienem skasować się cię (puff) na kasę, no ale cóż. Masz gotowca w trzech rodzajach:

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

public class Main {

    public static void main(String[] args) {
        new Main().run();
    }

    void run() {
        int[][][] tablica = {{{1}, {2}, {3}}, {{1, 2}, {2, 3}}, {{1, 2, 3}}};
        System.out.println("Wersja for-each:");
        System.out.print("[");
        for (int[][] t2 : tablica) {
            System.out.print("[");
            for (int[] t1 : t2) {
                System.out.print(Arrays.toString(t1) + ", ");
            }
            System.out.print("], ");
        }
        System.out.println("]");
        System.out.println("Wersja standard:");
        System.out.print("[");
        for (int i = 0; i < tablica.length; i++) {
            System.out.print("[");
            for (int j = 0; j < tablica[i].length; j++) {
                System.out.print(Arrays.toString(tablica[i][j]));
                System.out.print(j + 1 == tablica[i].length ? "" : ", ");
            }
            System.out.print(i + 1 == tablica.length ? "]" : "], ");
        }
        System.out.println("]");
        System.out.println("Wersja na kolekcjach:");
        List<List<List<Integer>>> lista = new ArrayList<List<List<Integer>>>();
        lista.add(new ArrayList<List<Integer>>());
        lista.get(0).add(Arrays.asList(1));
        lista.get(0).add(Arrays.asList(2));
        lista.get(0).add(Arrays.asList(3));
        lista.add(new ArrayList<List<Integer>>());
        lista.get(1).add(Arrays.asList(1, 2));
        lista.get(1).add(Arrays.asList(2, 3));
        lista.add(new ArrayList<List<Integer>>());
        lista.get(2).add(Arrays.asList(1, 2, 3));
        System.out.println(lista);
    }
}

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit
Noran
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:42
0

Dziękuję. Bardzo mi pomogłeś Wibowit. Pozdrawiam.

szypxx
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 12 lat
0

Tak ładniej w foreach:

Kopiuj
        System.out.print(Arrays.toString(t1));
	System.out.print(t1[0] == t2.length? "" : ", ");
 

... i szczerze mówiąc nie wiem czego to działa :]

edytowany 1x, ostatnio: szypxx
Wibowit
Bo mam akurat takie, a nie inne liczby w tablicy, zmień je sobie to dostaniesz zły wynik. W końcu ten warunek co stworzyłeś w ogólności nie ma najmniejszego sensu.
Noran
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:42
0

Posiadam taką strukturę:

Kopiuj
 List<List<Integer>> lista = new ArrayList<List<Integer>>();
lista.add(Arrays.asList(1,2,3,4,5));

w jaki sposób do istniejącej listy (1,2,3,4,5) dodać szósty element? Logicznym byłoby:

Kopiuj
 lista.get(0).add(6);

niestety, pojawia się wyjątek.

edytowany 2x, ostatnio: Noran
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:37 minut
1

Implementacja List zwracana przez Arrays.asList ma sztywny rozmiar (tak jest opisane w javadoc, owa kolekcja to tylko nakładka na zwykłą tablicę, zmiany w tablicy są widoczne w liście i vice versa). Istnieje konstruktor dla ArrayList (i chyba wszystkich innych kolekcji standardowych), który przyjmuje kolekcję i kopiuje do siebie jej elementy (ale płytko, tzn nie robi kopii elementów, tylko kopiuje referencje). Pełny kod obrazujący zagadnienie:

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

public class Main {

    public static void main(String[] args) {
        new Main().run();
    }

    void run() {
        List<Integer> listaNierozszerzalna = Arrays.asList(1, 2, 3);
        try {
            listaNierozszerzalna.add(4);
        } catch (UnsupportedOperationException ex) {
            System.out.println("Nieprawidłowa operacja.");
        }
        System.out.println(listaNierozszerzalna);
        List<Integer> listaRozszerzalna =
                new ArrayList<Integer>(listaNierozszerzalna);
        listaRozszerzalna.add(4);
        System.out.println(listaRozszerzalna);
    }
}
Kopiuj
import java.util.Arrays;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        new Main().run();
    }

    void run() {
        Integer[] tablica = {1, 2, 3};
        List<Integer> lista = Arrays.asList(tablica);
        System.out.println(Arrays.toString(tablica));
        System.out.println(lista);
        tablica[0] = 4;
        System.out.println(Arrays.toString(tablica));
        System.out.println(lista);
        lista.set(0, 5);
        System.out.println(Arrays.toString(tablica));
        System.out.println(lista);
    }
}

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 6x, ostatnio: Wibowit
Noran
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:42
0

Dzięki za odpowiedzi Wibowit, sporo z nich wyniosłem.

Po przemyśleniu zagadnienia i przeanalizowaniu potrzeb otrzymałem satysfakcjonującą mnie strukturę. Pozdrawiam.

Kopiuj
// Wielowymiarowa Lista

import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
public class Main {
 
    public static void main(String[] args) {
        new Main().run();
    }
 
    void run() 
    {
        List<List<Integer>> lista = new ArrayList<List<Integer>>();
        
        List<Integer> listaRozszerzalna = new ArrayList<Integer>();
        List<Integer> listaRozszerzalna2 = new ArrayList<Integer>();
        List<Integer> listaRozszerzalna3 = new ArrayList<Integer>();
        
        lista.add(listaRozszerzalna);
        lista.add(listaRozszerzalna2);
        lista.add(listaRozszerzalna3);
        
        System.out.println("Dodawanie do zagniezdzonych list przy uzyciu odwolania bezposrednio do nich");
        listaRozszerzalna.add(1);
        listaRozszerzalna.add(2);
        listaRozszerzalna3.add(3);
        
        System.out.println(lista);
        System.out.println(listaRozszerzalna);
        System.out.println(listaRozszerzalna.get(0));
        System.out.println("rozmiar listy pierwszej: " + listaRozszerzalna.size()); 
        
        System.out.println("Dodawanie do zagniezdzonych list przy uzyciu listy nadrzednej");
        lista.get(1).add(4);
        lista.get(0).add(5);
        
        System.out.println(lista);
        System.out.println(lista.get(0));
        System.out.println(lista.get(0).get(0));
        System.out.println("rozmiar calej listy: " + lista.size()); 
    }
} 
edytowany 5x, ostatnio: Noran
Wibowit
Brawo. Teraz dla sportu możesz sobie pomieszać ArrayListy i LinkedListy, tzn w niektórych miejscach zamiast new ArrayList napisać new LinkedList. Potem powinieneś sobie poczytać javadoc o obu rodzajach list.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.