如何使用java。设置

2022-09-03 08:29:32

我试图让它工作很长一段时间,但似乎无法得到它。我有对象塔建在布洛克的。我已经使用数组使它工作,但我想学习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.");
}

如何实现它?


答案 1

你需要学习的第一件事是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)
    • 一致:除非对象已发生突变,否则不得更改x.equals(y)
    • x.equals(null) == false
  • 总合同是:hashCode
    • 一致:除非发生突变,否则返回相同的数字
    • 与 一致:如果,则equalsx.equals(y)x.hashCode() == y.hashCode()
      • 严格来说,对象不等式不需要哈希码不等式
      • 但哈希代码不等式必然需要对象不等式
  • 什么算作突变应该在 和 之间保持一致。equalshashCode

接下来,您可能希望对对象进行排序。为此,可以使类型实现具有可比性,或者提供单独的比较器

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


有关堆栈溢出的更多读数:


答案 2

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

编辑:

我以为你的意思是它在运行时不起作用...你是说那个还是在编译时?如果编译时是什么错误消息?如果它在运行时崩溃,什么是堆栈跟踪?如果它编译并运行但不能正常工作,那么等于和哈希代码是可能的问题。