android 两个不重复的数组集合中,求共同的元素

这篇博客探讨了如何在Android中找到两个不重复数组集合的交集。通过示例,作者展示了两种方法:一是使用双层循环查找共同元素,二是针对对象类型的集合,强调了重写equals()和hashCode()方法的重要性,以正确比较对象的等价性。

比如我一个集合中有[1,2,3,4] 另外一个集合中有[3,4,5,6]  它共同的元素是3。

第一种解决方案

思想:是定义一个空集合。然后把上面的二个集合双层for循环找出其共同的元素

  List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        List<Integer> list1 = new ArrayList<>();
        list1.add(3);
        list1.add(4);
        list1.add(5);
        //定义一个空集合
        List<Integer> emptyList = new ArrayList<>();
        for(int i=0;i<list.size();i++){
            for(int j=0;j<list1.size();j++){
                 if(list.get(i)==list1.get(j)){
                     emptyList.add(list.get(i));
                 }
            }
        }
        Log.e("MainActivity","相同的元素是-->"+emptyList);

求不同的元素也简单,就是利用emptyList去和上面的集合进行循环就知道结果.这是我们自己写的,哪API应该有更省事的,业就是api会把我们的for循环 我们只要调用就行

 List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list
<think>我们是在Android开发环境下,通常使用Java或Kotlin。合并两个数组并去重,可以有多种方法。根据引用[1]和[4]中提到的思路,我们可以使用Stream API(Java8及以上)来合并两个List并去重。另外,也可以使用Set集合的特性(自动去重)来实现。但是注意:数组和List略有同,我们可以先将数组转换为List,处理后再转换回数组,或者直接使用集合操作。这里提供几种方法:方法1:使用StreamAPI(需要AndroidAPI24及以上,即Android7.0,Nougat)步骤:1.将两个数组合并为一个List(或直接使用Stream.of()和flatMap)2.使用distinct()去重3.收集为List,然后转换为数组(如果需要数组)方法2:使用HashSet(无序)或LinkedHashSet(保持顺序)步骤:1.将两个数组元素添加到一个Set中(Set会自动去重)2.将Set转换为数组方法3:使用循环遍历,手动去重(适用于低版本Android,或者需要保持顺序且使用Set的情况)根据引用[3],我们也可以使用双指针的方法,但前提是数组已经排序。如果未排序,可以先排序再用双指针,但这样会改变顺序。用户的问题中没有说明是否要保持顺序,以及数组是否有序。我们提供多种方法供选择。下面分别用Java代码实现:假设有两个数组:array1和array2,元素类型为T(假设为String,也可以是其他类型,但需要正确实现equals和hashCode方法)。方法1:使用Stream(API24+)```javaimport java.util.Arrays; importjava.util.stream.Stream;public classArrayMerge{public staticString[]mergeAndDistinctWithStream(String[] array1,String[]array2) {returnStream.concat(Arrays.stream(array1), Arrays.stream(array2)).distinct().toArray(String[]::new);}} ```方法2:使用HashSet(保证顺序)```javaimportjava.util.*; publicclass ArrayMerge {publicstatic String[] mergeAndDistinctWithHashSet(String[]array1, String[] array2){Set<String> set= newHashSet<>(Arrays.asList(array1));set.addAll(Arrays.asList(array2));returnset.toArray(newString[0]);}} ```方法3:使用LinkedHashSet(保持插入顺序,即先array1再array2,且每个数组元素保持原顺序)```javaimportjava.util.*; publicclass ArrayMerge {publicstatic String[] mergeAndDistinctWithLinkedHashSet(String[] array1,String[]array2) {Set<String>set =new LinkedHashSet<>(Arrays.asList(array1));set.addAll(Arrays.asList(array2));return set.toArray(new String[0]);}} ```方法4:手动去重(使用List,保持顺序)这种方法先合并两个数组,然后遍历合并后的列表,将重复元素放入新列表。```javaimportjava.util.*; publicclass ArrayMerge {publicstatic String[] mergeAndDistinctManually(String[] array1,String[]array2) {List<String>list =new ArrayList<>(Arrays.asList(array1));list.addAll(Arrays.asList(array2));List<String> resultList= newArrayList<>();for(Stringitem :list){if (!resultList.contains(item)) {resultList.add(item);}}returnresultList.toArray(new String[0]);} }```注意:方法4中使用了List的contains方法,其时间复杂度为O(n),所以整体是O(n^2),效率较低,适用于小数组。如果数组元素是自定义对象,那么需要重写该对象的equals和hashCode方法,以便Set和distinct()能够正确判断重复。例如,引用[1]中的User类,我们重写equals和hashCode(假设根据name和second判断相等,或者根据业务需):```javapublic classUser {privateString name;private Integersecond;//省略getter和setter@Overridepublicboolean equals(Object o) {if(this== o) returntrue;if(o== null|| getClass()!= o.getClass())return false;User user= (User)o;returnObjects.equals(name,user.name) &&Objects.equals(second, user.second);}@Overridepublicint hashCode() {returnObjects.hash(name,second);}} ```然后,对于User数组,同样可以使用上述方法(例如使用Stream): ```javaUser[]array1= ...; User[] array2 =...;List<User> mergedList= Stream.concat(Arrays.stream(array1), Arrays.stream(array2)).distinct().collect(Collectors.toList());```总结:在Android开发中,根据API版本要和性能需选择合适的方法。推荐使用Set的方式(方法2或3)或者Stream(方法1)因为它们的效率更高。注意:如果使用Stream,请确保minSdkVersion>=24,否则需要依赖desugar或使用其他方法。如果需要在低版本使用Stream,可以考虑使用第三方库(如StreamSupport)或者使用其他方法。相关问题:1.在Android中如何合并两个数组并保持原始顺序?2.如果数组元素是自定义对象,如何实现去重?3.在低版本Android(低于API24)中如何使用StreamAPI?4.上述几种方法的性能比较如何?5.如何合并两个以上的数组并去重?</think>在Android开发中合并两个数组并去除重复元素,可通过以下方法实现(以Java为例): ### 方法1:使用HashSet(自动去重) ```java // 合并两个String数组并去重 public static String[] mergeArrays(String[] arr1, String[] arr2) { Set<String> set = new HashSet<>(); Collections.addAll(set, arr1); // 添加第一个数组 Collections.addAll(set, arr2); // 添加第二个数组(自动去重) return set.toArray(new String[0]); // 转为数组 } ``` ### 方法2:使用Stream API(Java 8+) ```java // 合并两个自定义对象数组(如User类)并去重 public static List<User> mergeObjectArrays(User[] arr1, User[] arr2) { return Stream.concat(Arrays.stream(arr1), Arrays.stream(arr2)) .distinct() // 依赖equals()和hashCode() .collect(Collectors.toList()); } ``` **注意**:自定义对象需重写`equals()`和`hashCode()`方法(引用[1][^1]): ```java public class User { private String name; private Integer second; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return Objects.equals(name, user.name) && Objects.equals(second, user.second); } @Override public int hashCode() { return Objects.hash(name, second); } } ``` ### 方法3:手动遍历去重(兼容低版本) ```java public static String[] manualMerge(String[] arr1, String[] arr2) { List<String> list = new ArrayList<>(); // 合并数组 for (String s : arr1) if (!list.contains(s)) list.add(s); for (String s : arr2) if (!list.contains(s)) list.add(s); return list.toArray(new String[0]); } ``` ### 关键点说明 1. **基础类型数组**:直接使用`HashSet`最简洁高效 2. **对象数组**:必须正确重写`equals()`和`hashCode()`(引用[4][^4]) 3. **性能考量**: - `HashSet`时间复杂度为$O(n)$ - 手动遍历时间复杂度为$O(n^2)$,仅适用于小数据集 4. **顺序保留**:需保持顺序时改用`LinkedHashSet` > 示例:合并两个用户列表时,`distinct()`会根据重写的`equals/hashCode`判断重复[^1]。若仅根据ID去重,可在`equals`中只比较ID字段。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值