Сортировка списка карт до того, как закончится цикл while (Java) - PullRequest
0 голосов
/ 15 мая 2011

Выполнен вызов базы данных, и результатом является набор строк из двух строковых столбцов типа A и B. например (x_a, y_b), (x_a, y1_b), (x2_a,y_b)

Идея состоит в том, чтобы составить список карт типа {(x_a,{y_b,y1_b}), (x2_a,{y_b})}, где объекты типа A не повторяются, и сделать это при извлечении результатов из базы данных.

Вот что я попробовал:

int i =0;
            List<String> type2 = new ArrayList<String>();
            Map<String,List<String>> type1_type2 = new HashMap<String,List<String>>();
            List<Map> list_type1_type2 = new ArrayList<Map>();

            String [] type1Array = new String[100];
            String [] type2Array = new String[100];
            int trackStart = 0;
while (res.next()){


                String type1 = res.getString(1);
                String type2 = res.getString(2);
                type1Array[i]=type1;
                type2Array[i] = type2;


                if(i>0 && !type1Array[i].equals(type2Array[i-1])){
                    int trackStop = i;
                    for(int j = trackStart; j<trackStop;j++){
                        type2.add(type2Array[j]);
                    }
                    type1_type2.put(type1Array[i-1], type2);
                    list_type1_type2.add(type1_type2);

                //debugging stuff   
                 String x = list_type1_type2.toString();
         System.out.println(x);
System.out.println(" printing because "+ type1Array[i]+" is not equal to " + type1Array[i-1]);
        type2 = new ArrayList<String>();
     type1_type2 = new HashMap<String,List<String>>();
                     trackStart=i;
                     }

                     i++;


                }

Этот метод не работает, если последние значения type1 объекта результата совпадают.

Есть ли способ сделать это в том же духе (в рамках while (res.next)) без предварительного сохранения результатов вызова базы данных в отдельных массивах или добавления дополнительного цикла for вне цикла while для «исправления» вверх "?

Ответы [ 2 ]

0 голосов
/ 16 мая 2011

Если вам не нужны дубликаты, такие как {x_a: [y_b, y_b]}, тогда используйте набор в качестве значения вашей карты:

Map<String,Set<String>> type1_type2;

Я не знаю, для чего нужны другие списки и массивы. Вы можете, вероятно, просто обойтись с картой type1_type2. Обрабатывать каждый (x, y) в псевдокоде:

Set s = type1_type2.get(x)
if s == null:
    s = new Set()
    type1_type2.put(x, s)
s.add(y)
0 голосов
/ 15 мая 2011

Простой способ сделать это - использовать Guava / Google Collections SetMultiMap. По сути, это сопоставление ключа (ваших объектов «A») с набором значений (ваших объектов «B»).

[Я не собираюсь пытаться закодировать это для вас. Ваш текущий код слишком ужасен для чтения ... если вы не платите мне :-)]

Однако лучшей идеей было бы заставить базу данных выполнять сопоставление. Если вы можете сделать это, вы уменьшите объем (избыточных) данных, которые отправляются через соединение с базой данных ... при условии, что вы используете JDBC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...