如何使用java.Set

owc*_*wca 15 java collections interface set

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

}
Run Code Online (Sandbox Code Playgroud)

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

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.");
}
Run Code Online (Sandbox Code Playgroud)

怎么实现呢?

pol*_*nts 55

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

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

    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]"
Run Code Online (Sandbox Code Playgroud)

一旦熟悉了API,就可以使用它来包含更多有趣的对象.如果你还没有熟悉equalshashCode合同,那么现在是开始的好时机.

简而言之:

  • @Override 两者都没有; 从来没有一个.(非常重要,因为它必须满足财产:a.equals(b) == true --> a.hashCode() == b.hashCode()
    • 小心写作boolean equals(Thing other); 这不合适@Override.
  • 对于非null引用x, y, z,equals必须是:
    • 反身的:x.equals(x).
    • 对称:x.equals(y)if和only ify.equals(x)
    • 传递:如果x.equals(y) && y.equals(z),那么x.equals(z)
    • 一致:x.equals(y)除非对象发生变异,否则不得更改
    • x.equals(null) == false
  • 总合同hashCode是:
    • 一致:除非发生突变,否则返回相同的数字
    • 符合equals:if x.equals(y),thenx.hashCode() == y.hashCode()
      • 严格来说,对象不等式不需要哈希码不等式
      • 但哈希码不等式必然要求对象不等式
  • 什么算作突变应该equals和之间保持一致hashCode.

接下来,您可能想要对对象进行排序.您可以通过制作类型工具Comparable或单独提供来实现此目的Comparator.

要么易于对对象进行排序(Arrays.sort,Collections.sort(List)).它还允许您使用SortedSet,例如TreeSet.


有关stackoverflow的更多信息: