修改 对不起,我在某个地方有一个错字,当我重新阅读它约500次时我无法找到 - .- 我很抱歉浪费你的时间,但感谢你的投入。
我的问题是,我在某个"ghost"-elements
中有HashSet
。
我有 2 HashSets
Strings
(我们称之为 A 和 B )一个循环。
之后,我想比较它们并得到一些奇怪的结果:
A.size() -> 54201
B.size() -> 54201
然后,我做了一些操作,比如删除和保留我的集合(所有操作都使用原始集的副本完成):
A.removeAll(B).size() -> 48
B.removeAll(A).size() -> 0
这是我开始想知道的地方。如果没有重复项且集合大小相同,那么差异怎么可能不同?
A.retainAll(B).size() -> 54201
B.retainAll(A).size() -> 54201
它们似乎具有相同的元素和大小,但A
有更多48
元素(?!?)
A.equals(B) -> false
当我将它们转换为数组时,发生了这种情况:
Object[] A_array = A.toArray()
Object[] B_array = B.toArray()
A_array.length -> 54249 // here is my difference of 48 elements
B_array.length -> 54201
有谁知道这里发生了什么?
为什么数组中有48
个元素显然不在集合中?
感谢您的帮助,我真的没有想法。
修改
感谢您的评论,我将尝试说明更多细节和代码。至于MVCE,我会尝试获得一个,但我不确定它是否可行。
案例是,我通过IMAP下载电子邮件,然后从标题中读取消息ID。我为2个帐户执行此操作,然后我想比较它们是否具有相同的消息。
所以,继承代码(因为我必须使用jsps,它的java 1.6):
Set<String> srcMsgIds = new HashSet<String>();
Set<String> dstMsgIds = new HashSet<String>();
Message[] srcMsgs = imap.searchInAllFolder(srcEmail); // download javax.mail.Message
for(Message m : srcMsgs) {
IMAPMessage msg = (IMAPMessage) m;
String rfc822msgid = msg.getMessageID();
srcMsgIds.add(rfc822msgid.toLowerCase());
}
Message[] dstMsgs = imap.searchInAllFolder(destEmail); // download javax.mail.Message
for(Message m : dstMsgs) {
IMAPMessage msg = (IMAPMessage) m;
String rfc822msgid = msg.getMessageID();
dstMsgIds.add(rfc822msgid.toLowerCase());
}
int srcCount = new HashSet<String>(dstMsgIds).size(); // 54201
int dstCount = new HashSet<String>(dstMsgIds).size(); // 54201
Set<String> intersectionSrcDst = new HashSet<String>(srcMsgIds); // both in src and dst
intersectionSrcDst.retainAll(dstMsgIds);
int intersection1Count = intersectionSrcDst.size(); // 54201
Set<String> intersectionDstSrc = new HashSet<String>(dstMsgIds);
intersectionDstSrc.retainAll(srcMsgIds);
int intersection2Count = intersectionDstSrc.size(); // 54201
Set<String> srcNotDst = new HashSet<String>(srcMsgIds);
srcNotDst.removeAll(dstMsgIds);
int diff1Count = srcNotDst.size(); // 48
Set<String> dstNotSrc = new HashSet<String>(dstMsgIds);
dstNotSrc.removeAll(srcMsgIds);
int diff2Count = dstNotSrc.size(); // 0
Object[] srcArray = srcMsgIds.toArray();
Object[] dstArray = dstMsgIds.toArray();
int srcArrayLength = srcArray.length; // 54249
int dstArrayLength = dstArray.length; // 54201
再次感谢。
答案 0 :(得分:0)
How did you fill the sets ?
I try a very small piece of code without having these ghost effects.
HashSet<String> A = new HashSet<String>();
HashSet<String> B = new HashSet<String>();
A.add("dog"); B.add("dog");
A.add("cat"); B.add("cat");
A.add("mouse"); B.add("mouse");
A.add("dog"); B.add("dog");
System.out.println("A is: " + A);
System.out.println("B is: " + B);
// A.removeAll(B); System.out.println("A size is: " + A.size());
// A size is: 0
// B.removeAll(A); System.out.println("B size is: " + B.size());
// B size is: 0
// A.retainAll(B); System.out.println("A size after retain is: "+A.size());
// A size after retain is: 3
// B.retainAll(A); System.out.println("B size after retain is: "+B.size()); // B size after retain is: 3
System.out.println("A == B ? :" + A.equals(B)); // A == B ? :true
答案 1 :(得分:0)
当然,这是一个错字,我(我的同事们都没有)能够找到它...
对不起,谢谢你的