HashSet正在添加重复的字符串

时间:2017-05-18 12:15:10

标签: java set hashset

修改 对不起,我在某个地方有一个错字,当我重新阅读它约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

再次感谢。

2 个答案:

答案 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)

当然,这是一个错字,我(我的同事们都没有)能够找到它...

对不起,谢谢你的