- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个非常简单的 Pair 类,定义如下:
public class Pair<L, R> {
private L left;
private R right;
public Pair(L left, R right) {
this.left = left;
this.right = right;
}
public L getLeft() {
return this.left;
}
public R getRight() {
return this.right;
}
public String toString() {
return String.format("(%s, %s)", left, right);
}
public int hashCode() {
int hashFirst = left != null ? left.hashCode() : 0;
int hashSecond = left != null ? right.hashCode() : 0;
return (hashFirst + hashSecond) * hashSecond + hashFirst;
}
public Boolean equals(Pair other) {
if (other == null) {
return false;
}
return left.equals(other.getLeft()) && right.equals(other.getRight());
}
}
然后我定义了一个 Position 类,如下所示:
public class Position {
private Pair<Integer, Integer> pair;
public Position(Integer x, Integer y) {
this.pair = new Pair<Integer, Integer>(x, y);
}
public Integer getX() {
return this.pair.getLeft();
}
public Integer getY() {
return this.pair.getRight();
}
public boolean equals(Position other) {
if (other == null) {
return false;
}
boolean b = getX() == other.getX() && getY() == other.getY();
System.out.println(String.format("%s.equals(%s): %s", this, other, b));
return b;
}
public int hashCode() {
return pair.hashCode();
}
public String toString() {
return String.format("(%d, %d)", this.pair.getLeft(),
this.pair.getRight());
}
}
这一切都很好。然而,当我尝试测试它时,发生了一些奇怪的事情。
public class PositionTests extends TestCase {
private Position posOne;
private Position posTwo;
private Position posThree;
public PositionTests() {
posOne = new Position(7, 6);
posTwo = new Position(12, 7);
posThree = new Position(7, 6);
}
public void testCreationX() {
assertEquals(posOne.getX(), (Integer) 7);
}
public void testCreationY() {
assertEquals(posOne.getY(), (Integer) 6);
}
public void testEquality() {
// System.out.println("p1.e(p3): " + posOne.equals(posThree));
// System.out.println("p3.e(p1): " + posThree.equals(posOne));
//assertEquals(posOne, posThree);
assertEquals(posThree, posOne);
}
public void testInequality() {
assertFalse(posOne.equals(posTwo));
}
public void testXEquality() {
assertEquals(posOne.getX(), posThree.getX());
}
public void testYEquality() {
assertEquals(posOne.getY(), posThree.getY());
}
public void testSymmTrue() {
assertTrue(posOne.equals(posThree) == posThree.equals(posOne));
}
public void testSymmFalse() {
assertTrue(posOne.equals(posTwo) == posThree.equals(posTwo));
}
public void testHashSetSame() {
Set<Position> hSet = new HashSet<Position>();
hSet.add(posOne);
hSet.add(posThree);
hSet.add(posTwo);
hSet.add(posOne);
hSet.add(posOne);
hSet.add(posOne);
assertTrue(hSet.size() == 3);
}
public void testListContainsSuccess() {
List<Position> pList = new ArrayList<Position>();
pList.add(posOne);
pList.add(posTwo);
assertTrue(pList.contains(posOne));
}
public void testListContainsSuccessDiff() {
List<Position> pList = new ArrayList<Position>();
pList.add(posOne);
pList.add(posTwo);
// System.out.println(pList);
// System.out.println(posThree);
Boolean b = pList.contains(posThree);
System.out.println("contains: " + b);
assertTrue(pList.contains(posThree));
}
public void testListContainsFail() {
List<Position> pList = new ArrayList<Position>();
pList.add(posOne);
pList.add(posThree);
assertFalse(pList.contains(posTwo));
}
}
相关测试输出如下:
[junit] ------------- Standard Output ---------------
[junit] JUnit version is: 3.8.2
[junit] contains: false
[junit] (7, 6).equals((7, 6)): true
[junit] (7, 6).equals((7, 6)): true
[junit] (7, 6).equals((12, 7)): false
[junit] (7, 6).equals((12, 7)): false
[junit] (7, 6).equals((12, 7)): false
[junit] (7, 3).equals((7, 4)): false
[junit] ------------- ---------------- ---------------
[junit]
[junit] Testcase: testListContainsSuccessDiff took 0.005 sec
[junit] FAILED
[junit] null
[junit] junit.framework.AssertionFailedError
[junit] at com.group7.dragonwars.tests.PositionTests.testListContainsSuccessDiff(PositionTests.java:92)
[junit]
[junit] Testcase: testListContainsFail took 0 sec
[junit] Testcase: testYEquality took 0 sec
[junit] Testcase: testSymmTrue took 0.014 sec
[junit] Testcase: testSymmFalse took 0.001 sec
[junit] Testcase: testHashSetSame took 0 sec
[junit] Testcase: testListContainsSuccess took 0 sec
[junit] Testcase: testCreationY took 0 sec
[junit] Testcase: testEquality took 0.001 sec
[junit] FAILED
[junit] expected:<(7, 6)> but was:<(7, 6)>
[junit] junit.framework.AssertionFailedError: expected:<(7, 6)> but was:<(7, 6)>
[junit] at com.group7.dragonwars.tests.PositionTests.testEquality(PositionTests.java:43)
[junit]
[junit] Testcase: testInequality took 0.001 sec
[junit] Testcase: testXEquality took 0 sec
[junit] Testcase: testCreationX took 0 sec
[junit] Test com.group7.dragonwars.tests.AllTests FAILED
现在发布了所有相关代码和测试结果,我的问题是为什么assertEquals(posOne, posThree)以及对contains()的调用会失败?正如您在测试输出顶部看到的,.equals() 返回 true。我很困惑为什么这些会失败。在我的程序中,我必须使用手动列表遍历并手动调用 equals() 来检查列表成员资格,但是为什么? List 的文档说
Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)).
然而,.contains()
失败了。什么……?
最佳答案
如果您向 equals() 方法添加 @Override
注释,您就会看到问题。参数类型必须是Object
,而不是Position
。
@Override
public boolean equals(Object other) {
此外,Pair.hashCode()
中存在拼写错误。
int hashFirst = left != null ? left.hashCode() : 0;
int hashSecond = left != null ? right.hashCode() : 0;
^^^^^
关于java - 奇怪的断言等于并包含行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15838197/
我想创建一个基于 jQuery 的非常简单的 html 编辑器(不是所见即所得)。 我的问题是如何制作 textarea或 div可能 在上面写一些文字 然后样式即标签(例如 some stuff 将
根据文档 isset 条款“测试此项目中是否已设置给定属性”。我不明白设置属性时 isset 返回 true 还是 false 在下面的代码片段中,当 env.JAVA_HOME 未设置时,java.
我正在尝试取消映射 o这是执行 :only 的默认命令( :help :only ),所以我尝试的第一件事是: nmap o 这种作品,除非我按 ,等待超过timeoutlen ms 然后按 o
我有以下型号: class MetaData(models.Model): created_at = models.DateTimeField(auto_now_add=True, auto_
下面列出了两行代码。两者对日期和时间的期望相同,但只有一个有效。我正在使用 R 3.1。 以下不起作用: DateTime2=strftime("08/13/2010 05:26:24.350", f
我有一个关于 C 代码的问题。 #include void foo(void){ int a; printf("%d\n",a); } void bar(void){
如果文件大小 > 8k,为什么读取的最后一个字节 = 0? private static final int GAP_SIZE = 8 * 1024; public static void main(
我有一个命令 Get-Testdata从不同来源检索测试数据并将这些数据存储到 PSObject以不同的值作为属性。然后将对象总数存储为数组,以便于操作、排序、计算等。 我的问题是我希望能够将这些数据
我正在使用 epoll 将大消息写入使用 HTTP 协议(protocol)的服务器。 fds 都设置为非阻塞,我正在使用边缘触发事件。我知道对于 EPOLLIN,我需要循环读取 fd,直到返回 EA
这对我来说听起来很奇怪: $test_1 = 'string'; $test_2 = '0'; var_dump(intval($test_1)); // Output: int 0 var_dump
这个问题在这里已经有了答案: Java: Integer equals vs. == (7 个回答) 7年前关闭。 请您解释以下行为。 public class EqAndRef { publ
Drupal 的行为到底是什么? 它为模块开发人员提供什么类型的服务层? 它映射到 jQuery.ready 的关系类型是什么? 最佳答案 长版:Drupal.behaviors 不仅仅是 jQuer
以下代码: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ for (int i=0
人们可以将项目添加到数据库中。我让他们选择在此时添加它,或手动选择日期。 因此我得到了这个 HTML 结构。 (请注意,我将日期和时间选择器妥协为只有一行文本) Selec
创建了一个数据框: simpleDF is.na(simpleDF$vals) [1] TRUE TRUE FALSE > is.nan(simpleDF$vals) [1] FALSE TRU
我有一个大的 docker 镜像 A,我创建了一个新的 Dockerfile FROM A RUN rm /big-folder 我尝试使用以下方法构建图像: docker build --squas
我想知道以下情况下 JVM 的行为是什么: JVM 最小堆大小 = 500MB JVM 最大堆大小 = 2GB 操作系统有 1GB 内存 JVM启动后,程序运行一段时间后,使用内存超过1GB。我想知道
我们正在使用 spikeearrest 策略,但我们不了解其工作原理。峰值逮捕配置如下: 5pm 阅读文档,我们了解到,如果我们在一分钟内调用此流超过 5 次,则该策略将在第 5 次之后
我正在使用 cURL 发送 POST 请求: curl http://tarvos.local:8080/partial_Users/2 -d '{currentPage : 1, firstID :
我的表中有 6442670 条记录,我正在使用以下命令获取它们jdbctemplate 使用行号一次 1000000 个。以下是查询 select * from (select rowNum rn
我是一名优秀的程序员,十分优秀!