检查多维ArrayList是否多次具有值

时间:2015-01-14 10:45:41

标签: java arraylist multidimensional-array iteration

我有一个可变大小的多维ArrayList(在示例中我将假设它包含3个ArrayLists)。 这些ArrayLists包含Team对象,如下所示:Remco&里斯。 我只允许组合一次,所以Joris& Remco也算作副本。

我知道如何查看2个arraylists是否包含相同的值,但我将如何在可变大小的多维arraylist中执行此操作?

作为一个例子,我的arraylist看起来像这样:

[
[Hidde & Lege plaats, Hans & Sven, Martijn & Simon, Remco & Joris, Daniël & Wouter, Jelle & Aziz, Dylan & Jasper, Mart & Ramon, Tim & Job, Jan & Brian, Thomas & Robin, Kevin & a, Zeger & Chariss, Wilfred & Bart],
[Hidde & Bart, Hans & Lege plaats, Martijn & Sven, Remco & Simon, Daniël & Joris, Jelle & Wouter, Dylan & Aziz, Mart & Jasper, Tim & Ramon, Jan & Job, Thomas & Brian, Kevin & Robin, Zeger & a, Wilfred & Chariss],
[Hidde & Chariss, Hans & Bart, Martijn & Lege plaats, Remco & Sven, Daniël & Simon, Jelle & Joris, Dylan & Wouter, Mart & Aziz, Tim & Jasper, Jan & Ramon, Thomas & Job, Kevin & Brian, Zeger & Robin, Wilfred & a]
]

我添加了一些换行符以使其看起来更好。在程序中它只有一行。

3 个答案:

答案 0 :(得分:0)

这是一种方法

//假设ArrayList<ArrayList<String>> multiDimenArr有值,HashTable用于检查值/项的出现次数

1)2嵌套for循环以遍历multiDimenArr

2)针对multiDimenArr中的每个值...检查Hashtable是否已经有contains(Object value)

3)如果它已经存在//做你想做的事情

4)否则将value放入Hashtable

答案 1 :(得分:0)

我将假设您的数据结构是这样的:

ArrayList<ArrayList<String>> matrix = new ArrayList<>()

你的团队对象虽然似乎定义得很好,并且会受益于而不是是一个字符串...所以当你解析它们时,将它们解析成一个真实的对象。

public class Team {
   Set<String> teamMembers = new HashSet()

   public boolean equals( Object o  ) {
     return ( o instanceof Team && Team.class.cast(o).teamMembers.equals(this.teamMembers) )
   }
} 

然后,无论你如何组建你的团队,由相同成员组成的团队都是真实的。

注意:为了简洁起见,我要离开很多

或者,您可以将基础数据结构简化为

Set<Set<String>> matrixOfUniqueCells = new HashSet<>()

将强制执行独特成员的独特团队。

答案 2 :(得分:0)

让我重申一下你的问题&#39;如何测试两个列表列表是否根据自定义的相等定义相交?如果我误解了,请在评论中纠正我。

在Java 8中执行此操作的一种巧妙方法是通过流和使用flatMap来展平:

boolean hasCommonItem(List<List<String>> list1, List<List<String>> list2) {
    return list1.stream().flatMap(List::stream)
        .anyMatch(team1 -> list2.stream().flatMap(List::stream)
            .anyMatch(team2 -> teamEquals(team1, team2)));
}

然后,您将实现一个teamEquals方法,用于比较团队的字符串。在你的情况下可能是这样的:

private boolean teamEquals(Stream team1, String team2) {
    return members(team1).equals(members(team2));
}

private List<String> members(String team) {
    return Arrays.stream(team.split("&"))
        .map(String::trim)
        .sorted()
        .collect(Collectors.toList());
}

首先将团队创建为成员列表并使您的结构列出成员列表列表,效率会更高。