2015-01-14 3 views
0

У меня есть неизвестное количество записей, и мне нужно поместить все эти записи в двухмерный массив строк.инициализировать двухмерный массив строк с динамическим размером в java

Я не знаю количества записей и из-за этого не знаю числа строк и столбцов, которое требуется для инициализации массива строк 2d.

В настоящее время я использую, как показано ниже:

String[][] data = new String[100][100]; 

Здесь я жёстко количество строк и столбцов, но нужно что-то динамический допустимый размер в струнной 2d массива. Любые предложения pls!

Rgrds

+0

Вы рассмотрели структуру коллекции Java? – Smutje

ответ

5

Вы можете использовать следующий класс, который хранит ваши данные в HashMap и может преобразовать его в двумерный массив строк.

public class ArrayStructure { 
    private HashMap<Point, String> map = new HashMap<Point, String>(); 
    private int maxRow = 0; 
    private int maxColumn = 0; 

    public ArrayStructure() { 
    } 

    public void add(int row, int column, String string) { 
     map.put(new Point(row, column), string); 
     maxRow = Math.max(row, maxRow); 
     maxColumn = Math.max(column, maxColumn); 
    } 

    public String[][] toArray() { 
     String[][] result = new String[maxRow + 1][maxColumn + 1]; 
     for (int row = 0; row <= maxRow; ++row) 
      for (int column = 0; column <= maxColumn; ++column) { 
       Point p = new Point(row, column); 
       result[row][column] = map.containsKey(p) ? map.get(p) : ""; 
      } 
     return result; 
    } 
} 

Пример кода

public static void main(String[] args) throws IOException { 
    ArrayStructure s = new ArrayStructure(); 
    s.add(0, 0, "1"); 
    s.add(1, 1, "4"); 

    String[][] data = s.toArray(); 
    for (int i = 0; i < data.length; ++i) { 
     for (int j = 0; j < data[i].length; ++j) 
      System.out.print(data[i][j] + " "); 
     System.out.println(); 
    } 
} 

Выход

1 
4 
+0

спасибо за ваш гениальный ответ! этот подход работает! –

1

Вы можете temporarely хранить их в List<String[]> и использовать List#toArray(String[]), чтобы преобразовать его в двухмерном массиве.

Пример

public static void main(String[] args) throws IOException { 
    BufferedReader r = new BufferedReader(new FileReader(new File(
      "data.txt"))); 

    String line; 
    List<String[]> list = new ArrayList<String[]>(); 

    while ((line = r.readLine()) != null) 
     list.add(line.split(" +")); 

    String[][] data = new String[list.size()][]; 
    list.toArray(data); 

    for (int i = 0; i < data.length; ++i) { 
     for (int j = 0; j < data[i].length; ++j) 
      System.out.print(data[i][j]+" "); 
     System.out.println(); 
    } 
    r.close(); 
} 

data.txt

1 2 3 4 5 
2 5 3 
2 5 5 8 

Выходной

1 2 3 4 5 
2 5 3 
2 5 5 8 
+0

спасибо 4 ур ответ! но я сохраняю CSV-данные в массиве, что-то вроде i-й строки и n-го столбца, это будет значение, а в j-й строке и n + 12-й столбец будет значение. as like-str2dArr [i] [n] = "hi", str2dArr [j] [n + 12] = "hello". В этом случае ваш ответ может не работать. Это? Я знаю, если я использую List , и, наконец, я могу использовать toArray для получения String [] [], но здесь мне нужно прямо противоположное! Любое предложение! –

+0

в этом случае, нет ... Если вам нужно динамически добавлять материал в двумерный массив, этот подход не будет работать. –

+0

@SSingh см. Мой второй ответ, чтобы исправить эту проблему. –

1

Вы можете просто инициализировать с л iteral, пустой двумерный массив:

String[][] data = new String[][]{{}} 
+0

Я получаю исключение в консоли: Исключение в потоке «main» java.lang.ArrayIndexOutOfBoundsException: 1 при попытке поместить данные в массив данных! –

+0

Вам необходимо инициализировать каждое измерение динамическими данными и их размерами. Если вы не хотите этого делать, подумайте об использовании 'Map >' вместо этого, это позволит вам использовать реальный динамический размер. – Mena

0

Это должно работать:

public static void main(String args[]) throws IOException { 
    // create the object 
    String[][] data; 

    // ----- dinamically know the matrix dimension ----- // 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); 
    int r = Integer.parseInt(bufferedReader.readLine()); 
    int c = Integer.parseInt(bufferedReader.readLine()); 
    // ------------------------------------------------ // 

    // allocate the object 
    data = new String[r][c]; 

    // init the object 
    for (int i = 0; i < r; i++) 
     for (int j = 0; j < c; j++) 
      data[i][j] = "hello"; 
} 

В этом примере вы знаете матрицу размерности выполнения, определяя его вручную с помощью консоли.

Смежные вопросы