比较两种不同类型的ArrayLists以查找公共数据

时间:2015-01-13 16:06:53

标签: java arraylist collections compare

我有两个ArrayLists。 Arraylist存储包含不同属性的对象,其中一个属性是整数arraylist。

Arraylist two是一个整数arraylist。我想将Arraylist 2与存储在arraylist中的整数arraylist进行比较。为了让您更容易理解:

ArrayList1:

  • 属性1
  • 属性2
  • 整数Arraylist

ArrayList2 / Integer Arraylist

我已经尝试了几个小时来做​​这件事,但没有成功。这是我的想法:

我有这两个ArrayLists:

ArrayList<LottoTicket> ticketList = new ArrayList<>(); //ArrayList 1

ArrayList<Integer> drawNums = new ArrayList(); //ArrayList 2

现在,ArrayList 1存储对象LotteryTicket,它有一个名为'set'的整数ArrayList,它存储了5个抽奖号码。

我的想法是将'set'arraylist与drawNums arraylist进行比较:

for(LottoTicket l : ticketList)
{        
  if(l.getSet().contains(drawNums.get(1)))
  {
     System.out.println("1 number matches");
  } 
  else 
  {
     System.out.println("No matches");
  }
}

但这似乎不是一个好主意!任何帮助将非常感谢&amp;我希望这也能帮助别人!

由于

2 个答案:

答案 0 :(得分:3)

我认为您正在寻找两个Collection的常见项目。您可以List.retainAll(Collection) 从此列表中删除未包含在指定集合中的所有元素等等,

List<Integer> al = new ArrayList<>(l.getSet());
al.retainAll(drawNums);
System.out.printf("%d number(s) match.%n", al.size());

答案 1 :(得分:1)

而不是在绘制的数字列表中检查特定的位置,您应该检查列表contains是否是播放器选择的数字 - 毕竟,数字的顺序不应该。然后,只需count包含的数字。

此外,您可以将List转换为Set以加快查找速度(尽管这对于五个数字而言并不重要)。

Set<Integer> numsAsSet = new HashSet<>(drawNums);
for (LottoTicket ticket : ticketList) {
    long matches = ticket.getSet().stream()
                                  .filter(x -> numsAsSet.contains(x))
                                  .count();
    System.out.println("Number of matches: " + matches);
}