0

我有

b a, 
c b, 
c a, 
d e 

对并作为输出想要打印

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

您能否提供一些提示,如何使用 java 解决此问题。谢谢!

4

2 回答 2

0

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

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

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

于 2013-02-28T09:37:58.577 回答
0

我会用一个List<Set<String>>.

对于每一对,扫描您的组数组以查找其中任何一对是否已经在组中。如果是则添加另一个。

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

如果这对中的任何一项都没有找到,那么您就有了一个新组,将两者都添加到其中并将其添加到您的列表中。

这段代码似乎工作:

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]
于 2013-02-28T10:23:02.723 回答