【问题标题】:Checking if multidimensional ArrayList has a value multiple times检查多维 ArrayList 是否多次具有值
【发布时间】:2015-01-14 10:45:41
【问题描述】:

我有一个可变大小的多维 ArrayList(在示例中,我假设它包含 3 个 ArrayList)。 这些 ArrayList 包含如下所示的 Team 对象:Remco 和 Joris。 我只能组合一次,所以 Joris & Remco 也算作重复。

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

例如,我的数组列表如下所示:

[
[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]
]

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

【问题讨论】:

  • 实际上并不存在。可以在文件中更改名称,但我将编辑我的问题以使用示例中的名称。
  • 我认为唯一可用的选择是只检查每个值,如果整个数组中有另一个值。因为它们都应该是不同的,所以你不能避免单独查看每一个。

标签: java arraylist multidimensional-array iteration


【解决方案1】:

这是一种方法

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

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

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

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

4) 否则将value 放入Hashtable

【讨论】:

    【解决方案2】:

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

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

    虽然您的团队对象似乎定义明确,并且会受益于 not 作为字符串...所以当您解析它们时,将它们解析为真实对象。

    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<>()
    

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

    【讨论】:

      【解决方案3】:

      让我将您的问题重申为“我如何根据自定义的相等定义测试两个列表列表是否相交”。如果我误解了,请在 cmets 中纠正我。

      在 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());
      }
      

      首先将团队创建为成员列表,然后将您的结构列表创建为成员列表的列表会更有效。

      【讨论】:

        猜你喜欢
        • 2015-10-16
        • 1970-01-01
        • 1970-01-01
        • 2016-09-11
        • 2013-03-15
        • 2010-09-26
        • 2010-09-13
        • 2019-03-05
        • 1970-01-01
        相关资源
        最近更新 更多