ArrayList ведет себя очень странно - PullRequest
0 голосов
/ 13 марта 2012

Я получаю данные с листа XLS , используя jdbc sql .Ниже приведена моя программа.

Дело 1:

Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
c = DriverManager.getConnection( "jdbc:odbc:Excel Files", "", "" );
stmnt = c.createStatement();
String query = "select * from [Proficiency$];";
ResultSet rs = stmnt.executeQuery( query );
baseColumnList = new ArrayList();
while( rs.next()) {
    //baseColumnList.add(rs.getString(1));
    System.out.println(rs.getString(1));
    //System.out.println(baseColumnList);
}

Вывод:

Aadmin
Badmin
Badminimage
batch
Cadmin
Dadmin
Eadmin
rulesengine
Fadmin
genadmin
Gadmin
Hdomain-EU
Padmin
IAA

Дело 2:

Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
c = DriverManager.getConnection( "jdbc:odbc:Excel Files", "", "" );
stmnt = c.createStatement();
String query = "select * from [Proficiency$];";
ResultSet rs = stmnt.executeQuery( query );
baseColumnList = new ArrayList();
while( rs.next()) {
    baseColumnList.add(rs.getString(1));
    System.out.println(baseColumnList);
}

Вывод:

[Aadmin]
[Aadmin, Badmin]
[Aadmin, Badmin, Badminimage]
[Aadmin, Badmin, Badminimage, batch]
[Aadmin, Badmin, Badminimage, batch, Cadmin]
[Aadmin, Badmin, Badminimage, batch, Cadmin, Dadmin]
[Aadmin, Badmin, Badminimage, batch, Cadmin, Dadmin, Eadmin]
[Aadmin, Badmin, Badminimage, batch, Cadmin, Dadmin, Eadmin, rulesengine]
[Aadmin, Badmin, Badminimage, batch, Cadmin, Dadmin, Eadmin, rulesengine, Fadmin]
[Aadmin, Badmin, Badminimage, batch, Cadmin, Dadmin, Eadmin, rulesengine, Fadmin, genadmin]
[Aadmin, Badmin, Badminimage, batch, Cadmin, Dadmin, Eadmin, rulesengine, Fadmin, genadmin, Gadmin]
[Aadmin, Badmin, Badminimage, batch, Cadmin, Dadmin, Eadmin, rulesengine, Fadmin, genadmin, Gadmin, Hadmin-EU]
[Aadmin, Badmin, Badminimage, batch, Cadmin, Dadmin, Eadmin, rulesengine, Fadmin, genadmin, Gadmin, Hadmin-EU, Padmin]
[Aadmin, Badmin, Badminimage, batch, Cadmin, Dadmin, Eadmin, rulesengine, Fadmin, genadmin, Gadmin, Hadmin-EU, Padmin, IAA]

Пожалуйста, кто-нибудь может объяснить, почему arraylist ведет себя странно.

Обновление: ожидаемый результат - первый вывод.

Ответы [ 4 ]

2 голосов
/ 13 марта 2012

Это

System.out.println(baseColumnList);

печатает фактическое содержимое 1 списка. Результат совсем не странный. Список увеличивается на каждой итерации.


Чтобы повторить вывод вашего первого примера:

while( rs.next()) {
  baseColumnList.add(rs.getString(1));
  System.out.println(baseColumnList.get(baseColumnList.size()-1));
}

Но это чепуха. Следующий фрагмент более элегантен:

while( rs.next()) {
  String columnValue = rs.getString(1);
  baseColumnList.add(columnValue);
  System.out.println(columnValue);
}

1 На самом деле baseColumnList.toString() называется.

1 голос
/ 13 марта 2012

Я не совсем уверен, что вы думаете "странно".Во втором случае вы печатаете весь baseColumnList для каждого результата в вашем наборе результатов.

System.out.println(baseColumnList); 

Как вы можете видеть, он продолжает добавлять элементы в ваш baseColumnlist, так что это совсем не странно, на самом деле эточто вы ожидаете случиться

Удачи!

0 голосов
/ 13 марта 2012
    Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );

        c = DriverManager.getConnection( "jdbc:odbc:Excel Files", "", "" );
        stmnt = c.createStatement();
        String query = "select * from [Proficiency$];";
        ResultSet rs = stmnt.executeQuery( query );
        baseColumnList = new ArrayList();
        while( rs.next())
        {

            baseColumnList.add(rs.getString(1));
        }
       for(Object o: baseColumnList)
       {
         System.out.println((String)o);

       }
0 голосов
/ 13 марта 2012

Это кажется ожидаемым из вашего кода.Позвольте мне объяснить:

//this line adds a value to the list
baseColumnList.add(rs.getString(1));

//this line prints the whole list
System.out.println(baseColumnList);
  • В первой строке вы добавляете значение в список,
  • Во второй строке вы печатаете весь список.

На каждой итерации список увеличивается на один элемент и печатается после него.Чтобы предотвратить это, печатайте не весь список, а какое-то промежуточное значение, например:

//intermediate value
String temp= rs.getString(1);
//add it to the list
baseColumnList.add(temp);
//print only the value, and not the whole list
System.out.println(temp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...