用java对元素进行分组

用java对元素进行分组,java,grouping,Java,Grouping,我有 对和作为要打印的输出 b a, c b, c a, d e 你能给我一些提示,如何用java解决这个问题吗。 谢谢 使用TreeMap,其中键是元素名(a,b..),值是组(可以包含组号以及您需要了解的任何其他信息) 首先尝试定位该组。如果找不到,请创建一个新组并将其放入地图中。最后,只需迭代条目集即可打印键值对 我不会为您发布代码,因为这看起来像是一个家庭作业。我会使用列表 对于每一对,扫描您的组数组,以确定其中一对是否已在组中。如果是,则添加另一个 将一个或另一个对添加到组后

我有

对和作为要打印的输出

b a, 
c b, 
c a, 
d e 
你能给我一些提示,如何用java解决这个问题吗。 谢谢

使用TreeMap,其中键是元素名(a,b..),值是组(可以包含组号以及您需要了解的任何其他信息)

首先尝试定位该组。如果找不到,请创建一个新组并将其放入地图中。最后,只需迭代条目集即可打印键值对

我不会为您发布代码,因为这看起来像是一个家庭作业。

我会使用
列表

对于每一对,扫描您的组数组,以确定其中一对是否已在组中。如果是,则添加另一个

将一个或另一个对添加到组后,需要再次扫描,以查看添加的对是否存在于另一个组中。如果是,则必须合并这两个组

如果两个项目都没有找到,说明您有一个新组,请将这两个项目都添加到该组中,然后将其添加到列表中

此代码似乎有效:

a - group 1, 
b - group 1, 
c - group 1, 
d - group 2, 
e - group 2 

你尝试过什么吗?看起来像是联合查找不相交集或深度优先搜索的工作。谢谢你的回复!我试图用arrayList by contains()方法实现这一点,但不幸的是,无法找到最佳解决方案。另外,我正在考虑通过创建一个表和使用SQL查询来使用JDBC实现这一点,但是我找不到合适的查询语句!为什么您需要JDBC(或数据库)来实现这一点?请更清楚地解释您想要什么。例如,如果有另一对“d b”,那么您希望打印什么?谢谢您的回复!一个问题:如果我使用树形图,每个元素都有唯一的组,对吗?因为正如您从文章中看到的,多个元素可以具有相同的组。最初,输入的同一行中至少有两个元素应映射到相同的组中。稍后,此组还将展开,以从其中一个成员已分配给该组的对中获取未分配的元素。谢谢!我认为代码中有错误。@ArmMiner-请描述错误-对我来说效果很好。可能我的eclipse有问题,错误如下:-添加的类的非法修饰符;只允许public、abstract和final——第25行:无法解析组——第46行:无法实例化HashSetah类型!好的,我只发布了相关代码。现在我已经发布了整个类。我使用的是Java7-如果使用的是Java--7,您可能需要在看到“”的地方调整泛型。
public class Test {
  public static void main(String args[]) {
    new Test().test();
  }
  // Might be better to use a LinkedList here.
  List<Set<String>> groups = new ArrayList<>();

  // Keeps track of what we added and where.
  private static class Added {
    final int where;
    final String what;

    public Added(int where, String what) {
      this.where = where;
      this.what = what;
    }
  }

  // Add if allowed.
  Added add(Set<String> group, int where, String has, String what) {
    if (group.contains(has)) {
      group.add(what);
      return new Added(where, what);
    }
    return null;
  }

  void addPair(String a, String b) {
    // Is ether of the strings in any of the existing groups.
    Added added = null;
    for (int i = 0; added == null && i < groups.size(); i++) {
      Set<String> group = groups.get(i);
      added = add(group, i, a, b);
      if (added == null) {
        added = add(group, i, b, a);
      }
    }
    if (added != null) {
      // Merge any now-joined groups.
      for (int i = added.where + 1; i < groups.size(); i++) {
        Set<String> group = groups.get(i);
        if (group.contains(added.what)) {
          // Join them.
          groups.get(added.where).addAll(group);
          groups.remove(group);
          // There shouldn't be any more.
          break;
        }
      }
    } else {
      // New group - May be better to use a TreeSet here for print order.
      Set<String> group = new HashSet<>();
      group.add(a);
      group.add(b);
      groups.add(group);
    }
  }

  void printGroups(String title) {
    System.out.println(title);
    for (int i = 0; i < groups.size(); i++) {
      System.out.println("Group " + (i + 1) + "=" + groups.get(i));
    }
  }

  public void test() {
    addPair("b", "a");
    addPair("c", "b");
    addPair("c", "a");
    addPair("d", "e");
    printGroups("Test-1");
    addPair("d", "b");
    printGroups("Test-2");
  }
}
Test-1
Group 1=[b, c, a]
Group 2=[d, e]
Test-2
Group 1=[d, e, b, c, a]