Java 多头列表如何检查它是否包含值?

Java 多头列表如何检查它是否包含值?,java,linked-list,contains,long-integer,Java,Linked List,Contains,Long Integer,我试图检查long的列表是否不包含某个值。这似乎永远不会满足这个条件,即使我知道某个链表中不存在一个值 for(int i : organizationIDs){ if(!ListOfOrgIds.contains(Long.valueOf(i))){ addThese.add(new Long(i)); } } 我实际上是在寻找orgID数组中不存在的值,如果它不存在,请将其添加到addthis链接列表中。。。我是不是错过了一些我应该知道的细节 在调试器中找到

我试图检查long的列表是否不包含某个值。这似乎永远不会满足这个条件,即使我知道某个链表中不存在一个值

for(int i : organizationIDs){
    if(!ListOfOrgIds.contains(Long.valueOf(i))){
        addThese.add(new Long(i));
    }
}
我实际上是在寻找orgID数组中不存在的值,如果它不存在,请将其添加到
addthis
链接列表中。。。我是不是错过了一些我应该知道的细节

在调试器中找到的ListOfOrgIds

14057
821
18021
821
14057
18021
调试器中找到的OrganizationID

14057
821
18021
821
14057
18021
让我这么说吧,我正看着调试器,它告诉我
ListOfOrgIds.contains(i)
是假的。。。这显然是不真实的

具体来说,请查看ListOfOrgs的值


821确实在那里。为什么我在contains调用中得到一个false?

我想说的第一点是,似乎您最好使用
Set
,因为它不允许重复的元素。换句话说,做:

Set<Long> ids = new HashSet<Long>();
ids.add(Long.valueOf(1));
ids.add(Long.valueOf(1));
System.out.println(ids.size());
交叉口

结果:只有
A
B
中的元素将位于
C

要执行此操作,请执行以下操作:

Set<Long> a = ... ;
Set<Long> b = ... ;
Set<Long> c = new HashSet<Long>(a);
c.addAll(b);
Set<Long> a = ... ;
Set<Long> b = ... ;
Set<Long> c = new HashSet<Long>(a);
c.retainAll(b);
Set<Long> a = ... ;
Set<Long> b = ... ;
Set<Long> c = new HashSet<Long>(a);
c.removeAll(b);
另外,要将
列表
转换为
集合

List<Long> idsAsList = ... ;
Set<Long> idsAsSet = new HashSet<Long>(idsAsList);
如果它是
长[]
,则可以使用
数组。asList

Long[] idsAsArray = ... ;
Set<Long> ids = new HashSet<Long>(Arrays.asList(idsAsArray));
Long[]idsAsArray=;
Set id=新的HashSet(Arrays.asList(idsAsArray));

您遇到的问题是,java不允许原语先加宽再装箱,只允许先装箱再加宽。这意味着int不能成为Long,但int可以成为对象(通过Integer)。最上面的答案很好地描述了这一点。在这种情况下,您不会得到任何编译反馈,因为contains方法不使用list的type参数,它接受任何对象。这也让我在过去多次感到困惑

下面是一个显示您得到的结果和一个工作示例的示例。注意,所需的只是将int显式转换为long

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class BoxingTest {

    public static void main(String[] args) throws Exception {

        List<Integer> intList = Arrays.asList(new Integer[]{14, 24, 69});
        List<Long> sourceLongList = Arrays.asList(new Long[]{14L, 17L});

        List<Long> resultsList;
        /* Test as in question code */
        resultsList = new ArrayList<Long>();
        for(int i : intList){
            if(!sourceLongList.contains(i)){
                resultsList.add(new Long(i));
            }
        }
        printList(resultsList);

        /* Can't box then widen, so cast */
        resultsList = new ArrayList<Long>();
        for(int i : intList){
            if(!sourceLongList.contains((long)i)){
                resultsList.add(new Long(i));
            }
        }
        printList(resultsList);

    }

    private static <T> void printList(List<T> values){
        StringBuilder contents = new StringBuilder();
        for(T value : values){
            contents.append(value);
            contents.append(" ");
        }
        System.out.println("List contains: " + contents);
    }

}
import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
公共类BoxingTest{
公共静态void main(字符串[]args)引发异常{
List intList=Arrays.asList(新整数[]{14,24,69});
List sourceLongList=Arrays.asList(新的Long[]{14L,17L});
列表结果列表;
/*测试有问题的代码*/
resultsList=newarraylist();
for(inti:intList){
如果(!sourceLongList.contains(i)){
结果列表。添加(新长(i));
}
}
打印列表(结果列表);
/*不能盒然后扩大,所以铸造*/
resultsList=newarraylist();
for(inti:intList){
如果(!sourceLongList.contains((long)i)){
结果列表。添加(新长(i));
}
}
打印列表(结果列表);
}
私有静态void打印列表(列表值){
StringBuilder内容=新建StringBuilder();
对于(T值:值){
内容。追加(值);
内容。追加(“”);
}
System.out.println(“列表包含:“+内容”);
}
}

您能再显示一些代码吗。。因为这部分代码似乎是正确的。。除非
addthis.add()
ListOfOrgIds
没有问题,否则我们不知道它们的外观。顺便说一句,为什么你要创建一个
List
Long
列表,即使你向它们添加
integer
值,也应该没问题(尽管你可以使用相同的
Long
两次)-请展示一个简短但完整的程序来演示该问题。您能给我们举一个
listOfOrgIds
organizationIDs
列表的例子吗?@DmainEvent->
如您所见,14057不在listOfOrgIds
中。。似乎不。。我们在两个列表中都可以看到此值。。我们仍然无法了解你在做什么??你能发布完整的代码吗?不是真的要关注复制品。一套到底是什么?某种哈希表?我不小心复制了相同的变量输出。这将在我更新帖子时反映出来。集合是另一种不允许重复的集合类型。把它想象成一个列表,但没有顺序(在您的案例中可能不相关),也没有重复元素的可能性(在您的案例中可能不需要)。在这种情况下,它也要快得多,因为对于任何
列表
removeAll
retainal
都是O(n)=n^2,但是
HashSet
是O(n)=n。在幕后,它是用一种哈希表实现的,但它本身不是哈希表,因为它不像哈希表那样“映射”。另外,你是不是对我的答案投了反对票?只有当解决方案在技术上不正确或无法回答问题时,才应使用否决票。请参阅的答案,以获取有关如何使用经验丰富的SO成员感觉否决票的信息。我之所以投否决票,是因为我觉得您的帖子似乎没有回答我的问题。虽然所有这些设置都很有趣,但我有点困惑,为什么我的列表不会说某些东西不在其中,而它肯定不在其中。。。您甚至没有显示使用集合的等效示例。如果你编辑你的帖子,我会升级答案。我也不确定这是否能回答这个问题。问题首先使用了“List”API,即使它使用了“Set”,您也会在简单地使用“removeAll”方法就足够的情况下,用太多的信息淹没op。