2012-05-22 45 views
0

嗨,我想从两个字符串列表中获取公共值...列表A具有通过查询Excel数据库获取的值,列表B具有通过查询SQL数据库获取的值。我想从A和B中获得共同的价值,因为我使用了retainAll集合。但它不是印刷普通的价值。而是它给我[]。请帮我解决这个问题。除了使用retainAll以外,如何获得共同的值。请纠正我的代码片段。retainAll不打印值

 //connecting excel database and storing its values 
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
     conn=DriverManager.getConnection("jdbc:odbc:spreadsheetdb","",""); 
     out.println("Excel Database connected" +"<br>"); 

     Statement stmt=conn.createStatement(); 
     String excelquery="Select * from [Sheet1$]"; 
     ResultSet excelvalues= stmt.executeQuery(excelquery); 

     List A= new ArrayList(); 
     while(excelvalues.next()){ 
      A.add(excelvalues.getString("name"));} 

    //connection sql Db and storing its values 

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    connection = DriverManager.getConnection("jdbc:odbc:copyknowledgebase","sa","sqladmin"); 
    out.println("<br>"+"MSSQL connected " +"<br>") 

    Statement statement=connection.createStatement(); 
    String conceptquery="Select * from dbo.conc"; 
    ResultSet conceptdetails=statement.executeQuery(conceptquery); 
    Timestamp ts = new Timestamp(new java.util.Date().getTime()); 

    List B = new ArrayList(); 
    while(conceptdetails.next()){ 
    B.add(conceptdetails.getString("Cname")); 
    } 
    B.retainAll (A); 
    out.println(B); 
+0

您确定您的名单有您在调用retainAll之前所期望的数据。如果您事先打印出他们的价值会发生什么。 – n00begon

+0

是的,我有两个列表中的共同元素。 – user1193904

+0

如果retainAll对于找到收集的常见元素很有帮助,我不太确定。例如,如果列表A = {a,b,b,c}和B = {a,a,b,d} A.retainAll(B)= {a,b,b}但B在里面只有一个'b' 。保留只删除不在其他集合中的元素。 – Pshemo

回答

0

这有力地表明,有在你的清单AB没有共同的价值观。您是否尝试过调试/单步检查?

retainAll(collection)应该做你期望的。考虑以下简单示例:

public static void main(String[] args) throws DataException { 
    List<Integer> all = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8)); 
    List<Integer> even = Arrays.asList(2,4,6,8); 
    all.retainAll(even); 
    System.out.println(all); 
} 

...打印[2,4,6,8] - 即公共值。

至于altenatives,有很多的,你可以做到这一点的方式 - 这里有一个例子:

public static void main(String[] args) throws DataException { 
    List<Integer> all = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8)); 
    List<Integer> even = Arrays.asList(2,4,6,8); 

    List<Integer> common = new ArrayList<Integer>(all); 
    for (Integer i : all){ 
    if (!even.contains(i)){ 
     common.remove(i); 
    } 
    } 
    System.out.println(common); 
} 

...再次打印[2,4,6,8]

(实际上,这与AbstractCollection的做法非常相似,只不过它使用Iterator而不是for each循环,因此它可以随时修改集合,而不必创建副本。)