2013-05-15 7 views
-2

У меня есть матрица с r строк и c столбцов. Я храню матрицу в 2-D массиве. См. Рисунок ниже.Как реализовать 2D-список?

enter image description here

я найти минимальное число в каждой строке. если минимальное число лежит в первой колонке, я добавляю минимум в listC1.

Рассмотрите приведенный выше рисунок.

В первом ряду R1 минимальное число - 2, и оно находится в колонке C1. Я хочу добавить 2 в listC1. Во втором ряду R2 минимальное число - 4, и оно находится в колонке C3. Я хочу добавить 4 в listC3. В третьем ряду R3 минимальное число - 5, и оно находится в колонке C2. Я хочу добавить 5 в listC2. В двух словах, если минимальное число лежит в первом столбце, я добавлю минимальное число в первый список listC1, если минимальное число лежит во втором столбце, я добавлю минимальное число во второй список listC2, если минимальное число лежит в третьей колонке, я буду добавьте минимальное число в третий список listC3 и т. д. и т. д.

Теперь проблема, с которой я столкнулась, заключается в том, как создать список списков для реализации вышеуказанной логики. Я разработал некоторый код (см. Ниже), но он не работает должным образом. Пожалуйста, помогите мне в этой связи

Note: Ther number of columns may vary from 3 to 30 



final float[][] matrix = { 
      {2f, 8f, 5f}, 
      {9f, 7f, 4f}, 
      {8f, 5f, 6f}, 
      {7f, 3f, 9f}, 
      {1f, 5f, 5f}, 
      {8f, 7f, 5f}, 
     }; 

     Map<Integer, ArrayList<Float>> minsMap = new LinkedHashMap<>(); 



     for(int row=0; row < matrix.length; row++) 
     { 
      float min = Float.MAX_VALUE; 
      int mc = 0; 

      for(int col=0; col < matrix[row].length; col++) 
      { 
       if(matrix[row][col] < min) 
       { 
        min = matrix[row][col]; 
        mc = col; 
       } 

       ArrayList<Float> minList = minsMap.get(mc); 

       if(minList == null) 
       { 
        minList = new ArrayList<>(); 
        minsMap.put(mc, minList); 
       } 
       minList.add(min); 
      } 

     } 

     for(java.util.Map.Entry<Integer, ArrayList<Float>> e : minsMap.entrySet()) 
     { 
      System.out.println("Min values in column " + e.getKey() + ": " + e.getValue()); 
     } 
+0

Что значит «это не работает должным образом»? Что он делает/не делает конкретно? – drewmoore

+0

Вы можете сначала инициализировать и добавить все пустые вложенные группы, затем использовать что-то вроде 'group.get (atIndex) .add (minValue);' – assylias

+0

Вы можете проверить [Таблицу] Guava (http: //docs.guava-libraries). googlecode.com/git/javadoc/com/google/common/collect/Table.html) – jontejj

ответ

0

nestedGroup инициализируется только когда-то используется для всех столбцов. Это неверно, вам нужна вложенная группа для каждого столбца.

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

private final static float[][] matrix = { 
    {2f, 8f, 5f}, 
    {9f, 7f, 4f}, 
    {8f, 5f, 6f}, 
    {7f, 3f, 9f}, 
    {1f, 5f, 5f}, 
    {8f, 7f, 5f}, 
}; 


@Test 
public void minOfMatrixColumn() { 
    Map<Integer, List<Float>> minsMap = new LinkedHashMap<>(); 
    for(int r = 0; r < matrix.length; r++) { 
     float min = Float.MAX_VALUE; 
     int mc = 0; 
     for(int c = 0; c < matrix[r].length; c++) { 
      if(matrix[r][c] < min) { 
       min = matrix[r][c]; 
       mc = c; 
      } 
     } 
     List<Float> minList = minsMap.get(mc); 
     if(minList == null) { 
      minList = new ArrayList<>(); 
      minsMap.put(mc, minList); 
     } 
     minList.add(min); 
    } 
    for(Entry<Integer, List<Float>> e : minsMap.entrySet()) { 
     System.out.println("Min values in column " + e.getKey() + ": " + e.getValue()); 
    } 
} 

Выход

Min values in column 0: [2.0, 1.0] 
Min values in column 2: [4.0, 5.0] 
Min values in column 1: [5.0, 3.0] 

Обратите внимание, что списки не упорядочены по индексу столбца.

+0

Минимальные значения в столбце 0: [2.0, 2.0, 2.0, 9.0, 8.0, 7.0, 1.0, 1.0, 1.0, 8.0] – user1703737

+0

Минимальные значения в столбце 1: [7.0, 5.0, 5.0, 3.0, 3.0, 7.0] – user1703737

+0

Мин. значения в столбце 2: [4.0, 5.0] – user1703737

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