Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将第三个列表仅传递给公共对象?_Java_List - Fatal编程技术网

Java 如何将第三个列表仅传递给公共对象?

Java 如何将第三个列表仅传递给公共对象?,java,list,Java,List,我需要将两个列表之间的普通用户传递到第三个列表 List<User> listByCity = new ArrayList<User>(); List<User> listByService = new ArrayList<User>(); //initializing listByCity and listByService happens here . . . List<User> newList = new ArrayList&l

我需要将两个列表之间的普通用户传递到第三个列表

List<User> listByCity = new ArrayList<User>();
List<User> listByService = new ArrayList<User>();
//initializing listByCity and listByService happens here
.
.
.
List<User> newList = new ArrayList<User>();

newList.addAll(listByCity);
newList.addAll(listByService);
List listByCity=new ArrayList();
List listByService=new ArrayList();
//初始化listByCity和listByService发生在这里
.
.
.
List newList=newarraylist();
newList.addAll(listByCity);
newList.addAll(listByService);

所以我有一个城市的用户列表和另一个提供服务的用户列表,我只需要普通用户,我可以怎么做?我刚刚使用“addAll”添加了两个列表,但它无法按我所希望的方式工作。

您可以使用
retainal()
保持两个列表的相交:

List<User> newList = new ArrayList<User>();
newList.addAll(listByCity);
newList.retainAll(listByService);
List newList=newarraylist();
newList.addAll(listByCity);
newList.retainal(listByService);

只有当
User
正确地实现
equals()
时(或者如果对象实际上是相同的引用),这才有效。

使用
retainal

 List<User> newList = new ArrayList<User>(listByCity);
 newList.retainAll(listByService);

对于小列表,我建议使用另一个答案所建议的
List.retainal()

如果列表很大,您可以从将要保留的列表中创建一个
哈希集
,并显式迭代,从而获得更好的性能:

List<User> newList = new ArrayList<User>();
Set<User> testSet = new HashSet<>(listByService);
for (User user: listByCity) {
    if (testSet.contains(user)) {
        newList.add(user);
    }
}
List newList=newarraylist();
Set testSet=newhashset(listByService);
for(用户:listByCity){
if(testSet.contains(用户)){
添加(用户);
}
}

您可以通过组合两个列表并将它们过滤到第三个列表中来使用流API:

    List<User> listByCity = Arrays.asList( new User("c1", "s1"), new User("c2", "s2"), new User("c1", "s3") );
    List<User> listByService  = Arrays.asList( new User("c2", "s3"), new User("c1", "s2"), new User("c1", "s3") );

    List<User> newList = Stream.concat( listByCity.stream(), listByService.stream() )
    .sequential()
    .filter( u -> u.getCity().equals("c1") && u.getService().equals("s3") )
    .collect( Collectors.toList() );
List listByCity=Arrays.asList(新用户(“c1”、“s1”)、新用户(“c2”、“s2”)、新用户(“c1”、“s3”);
listByService=Arrays.asList(新用户(“c2”、“s3”)、新用户(“c1”、“s2”)、新用户(“c1”、“s3”);
List newList=Stream.concat(listByCity.Stream(),listByService.Stream())

.filter(u->u.getCity().equals(“c1”)和&u.getService().equals(“s3”))
.collect(Collectors.toList());

没有,我没有。我刚刚让用户使用sql,并在“newList”中添加了这两个列表。您所建议的方法不起作用,原因是?@YgorFraga如果您希望能够根据用户的属性(例如id、名称)比较用户,则需要覆盖
equals()
。否则,将使用引用相等。我已编辑了我的答案以添加相等方法,您可以将其添加到用户类中。如果您想使用对象标识作为相等测试,则不必重写
equals
即可使用
retainal
。我做了一些细微的更改,代码可以正常工作expected@YgorFraga-很高兴听到。你必须做什么改变?用这种方式使用“HashSet”对我不起作用,这很奇怪。我使用了一个普通的用户列表。@YgorFraga-实际上,这有点令人震惊。它以什么方式不起作用?
    List<User> listByCity = Arrays.asList( new User("c1", "s1"), new User("c2", "s2"), new User("c1", "s3") );
    List<User> listByService  = Arrays.asList( new User("c2", "s3"), new User("c1", "s2"), new User("c1", "s3") );

    List<User> newList = Stream.concat( listByCity.stream(), listByService.stream() )
    .sequential()
    .filter( u -> u.getCity().equals("c1") && u.getService().equals("s3") )
    .collect( Collectors.toList() );