Конвертировать Resultset в карту - PullRequest
0 голосов
/ 24 марта 2019

У меня есть запрос, который будет возвращать два значения (столбец A и столбец B), как показано ниже

A        B
------------
a   aaa
a   aaa
a   aaa
a   aaa
b   bbb
c   ccc
c   ccc
b   bbb
c   ccc
b   bbb

Я пытаюсь создать метод Java (Java 7), который будет получать все эти значения за один рази сохранить его в переменной коллекции (Map), как и все значения в следующем формате:

(a -> (aaa,aaa,aaa,aaa,aaa),
 b -> (bbb,bbb,bbb),
 c -> (ccc,ccc,ccc))

Ниже приведен метод, который я пытаюсь, но я даже не могу получить все данные в первую очередь:

import java.sql.*;
import java.util.ArrayList;

public class CollectionFrame {


    public static void main(String[] args) {

        try {
            // step1 load the driver class
            Class.forName("oracle.jdbc.driver.OracleDriver");

            // step2 create the connection object
            Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");

            // step3 create the statement object
            Statement stmt = con.createStatement();

            // step4 execute query

            // Lists of Lists to store the values
            ArrayList<ArrayList<String>> listOLists = new ArrayList<ArrayList<String>>();
            ArrayList<String> obj = new ArrayList<String>();

            ResultSet rs = stmt.executeQuery("select * from t");
            while (rs.next()) {
                // System.out.println(rs.getString(1) + " " + rs.getString(2));
                obj.add(rs.getString(1));
                // obj.add(rs.getString(2));
                listOLists.add(obj);
                obj.removeAll(obj);

            }

            // step5 close the connection object
            con.close();

            System.out.println(listOLists.toString());

        } catch (Exception e) {
            System.out.println(e);
        }

    }

}

приведенный выше код дает следующий результат

[[a, a, a, a, b, c, c, b, c, b], [a, a, a, a, b, c, c, b, c, b], [a, a, a, a, b, c, c, b, c, b], [a, a, a, a, b, c, c, b, c, b], [a, a, a, a, b, c, c, b, c, b], [a, a, a, a, b, c, c, b, c, b], [a, a, a, a, b, c, c, b, c, b], [a, a, a, a, b, c, c, b, c, b], [a, a, a, a, b, c, c, b, c, b], [a, a, a, a, b, c, c, b, c, b]]

Если я раскомментирую строку obj.removeAll(obj);, я получу следующее:

[[], [], [], [], [], [], [], [], [], []]

Язастрял здесь.Может ли кто-нибудь помочь мне, как действовать или предложить лучшее решение?

Ответы [ 3 ]

2 голосов
/ 24 марта 2019

Вы должны использовать карту для этого.

ResultSet rs = stmt.executeQuery("select * from t");
Map<String, List<String>> valueMap = new HashMap<>();

while (rs.next()) {
    String columnAstring = rs.getString(1);
    String columnBstring = rs.getString(2);

    valueMap.putIfAbsent(columnAstring, new ArrrayList<>());
    valueMap.get(columnAstring).add(columnBstring);

}

РЕДАКТИРОВАТЬ: Таким образом, putifabsent может быть весьма неэффективным, так как я буду создавать и отбрасывать много массивов.как указано @Andreas.Так что это было бы чуть менее чисто, но гораздо более эффективным способом сделать это!

Совместимо с JAVA 7

ResultSet rs = stmt.executeQuery("select * from t");
Map<String, List<String>> valueMap = new HashMap<>();

while (rs.next()) {
    String columnAstring = rs.getString(1);
    String columnBstring = rs.getString(2);

    if(!valueMap.containsKey(columnAstring)){
        valueMap.put(columnAstring, new ArrayList());
    }
    valueMao.get(columnA).add(columnBstring);

}

С Java 8 Lambdas

@ Ответ Мюрейника указал еще более чистый способ использования computeIfAbsent.

while (rs.next()) {
    String columnAstring = rs.getString(1);
    String columnBstring = rs.getString(2);

    valueMap.computeIfAbsent(columnAstring, k -> new ArrayList<>())
    valueMap.get(columnAstring).add(columnBstring);
}
1 голос
/ 24 марта 2019

Может быть, вы можете попробовать это. Это использует HashMap.

public class Main {
public static void main(String[] args) {

    //sample CSV strings...pretend they came from a file
    String[] csvStrings = new String[] {
      "a aaa","a aaa","a aaa","a aaa","b bbb","b bbb","b bbb",
      "b bbb","c ccc","c ccc","c ccc"
    };

    List<List<String>> csvList = new ArrayList<List<String>>();
    Map<String,ArrayList<String>> outVal 
        = new HashMap<String, ArrayList<String>>();

    for(String val:csvStrings){
        String outList[] = val.split(" ");
        if (outVal.containsKey(outList[0])){
            outVal.get(outList[0]).add(outList[1]);
        } else {
            ArrayList<String> inputList = new ArrayList<String>();
            inputList.add(outList[1]);
            outVal.put(outList[0],inputList);
        }
    }

   System.out.println(outVal.toString());  
}

}

Вот вывод: {a = [ааа, ааа, ааа, ааа], b = [bbb, bbb, bbb, bbb], c = [ccc, ccc, ccc]}

1 голос
/ 24 марта 2019

Я бы перебрал ResultSet и применил изменения к карте Map<String, List<String>>. На каждой итерации, если ключ (столбец A) не существует, необходимо добавить его с пустым списком, а затем, как только вы убедитесь, что у вас есть список для этого ключа, добавьте значение из столбца B. К счастью, Усовершенствования в Java 8 для интерфейса Map делают это довольно элегантным:

Map<String, List<String>> result = new HashMap<>();
while (rs.next()) {
    String a = rs.getString("a");
    String b = rs.getString("b");

    result.computeIfAbsent(a, k -> new ArrayList<>()).add(b);
}
...