如何使用java.Set

新手上路,请多包涵

我试图让它工作很长一段时间,但似乎无法得到它。我有一个由 Block 建造的对象 Tower。我已经使用数组让它工作了,但我想学习 Set 的。我想获得与此类似的功能:

 public class Tower {

public Tower(){
}

public Tower add(Block k1){

    //(...)
    //if block already in tower, return "Block already in tower"
}

public Tower delete(Block k1){

    //(...)
    //if block already dleted, show "No such block in tower"
}

}

有人给了我一些代码,但我在尝试使用它时经常出错:

 Set<Block> tower = new HashSet<Block>();

boolean added = tower.add( k1 );
if( added ) {
System.out.println("Added 1 block.");
} else {
System.out.println("Tower already contains this block.");
}

如何实施?

原文由 sasklacz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 542
2 个回答

您需要研究的第一件事是 java.util.Set API

这是一个如何使用其方法的小示例:

     Set<Integer> numbers = new TreeSet<Integer>();

    numbers.add(2);
    numbers.add(5);

    System.out.println(numbers); // "[2, 5]"
    System.out.println(numbers.contains(7)); // "false"

    System.out.println(numbers.add(5)); // "false"
    System.out.println(numbers.size()); // "2"

    int sum = 0;
    for (int n : numbers) {
        sum += n;
    }
    System.out.println("Sum = " + sum); // "Sum = 7"

    numbers.addAll(Arrays.asList(1,2,3,4,5));
    System.out.println(numbers); // "[1, 2, 3, 4, 5]"

    numbers.removeAll(Arrays.asList(4,5,6,7));
    System.out.println(numbers); // "[1, 2, 3]"

    numbers.retainAll(Arrays.asList(2,3,4,5));
    System.out.println(numbers); // "[2, 3]"

熟悉 API 后,您可以使用它来包含更多有趣的对象。如果您还不熟悉 equalshashCode 合同,现在是开始的好时机。

简而言之:

  • @Override 两者都有或没有;永远不会只有一个。 (非常重要,因为它必须满足属性: a.equals(b) == true --> a.hashCode() == b.hashCode()
    • 小心写 boolean equals(Thing other) 代替;这不是正确的 @Override
  • 对于非空引用 x, y, zequals 必须是:
    • 自反: x.equals(x)
    • 对称: x.equals(y) 当且仅当 y.equals(x)
    • 传递:如果 x.equals(y) && y.equals(z) ,那么 x.equals(z)
    • consistent: x.equals(y) 除非对象发生了变化,否则不得改变
    • x.equals(null) == false
  • hashCode 的总合同是:
    • consistent:除非发生突变,否则返回相同的数字
    • equals 一致:如果 x.equals(y) ,则 x.hashCode() == y.hashCode()
      • 严格来说,对象不等式不需要哈希码不等式
      • 但是哈希码不等式必然需要对象不等式
  • 什么算作突变应该在 equalshashCode 之间保持一致。

接下来,您可能想要对对象进行排序。您可以通过使您的类型实现 Comparable 或通过提供单独的 Comparator 来做到这一点。

使用其中任何一个都可以轻松对对象进行排序( Arrays.sortCollections.sort(List) )。它还允许您使用 SortedSet ,例如 TreeSet


关于stackoverflow的进一步阅读:

原文由 polygenelubricants 发布,翻译遵循 CC BY-SA 3.0 许可协议

您是否在 Block 类中覆盖了 equals 和 hashCode

编辑:

我假设你的意思是它在运行时不起作用……你是说那个还是在编译时?如果编译时错误信息是什么?如果它在运行时崩溃,堆栈跟踪是什么?如果它编译并运行但不能正常工作,则可能是 equals 和 hashCode 的问题。

原文由 TofuBeer 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题