如何在Java中打印2个数组中的公共元素而没有排序输出
Posted
技术标签:
【中文标题】如何在Java中打印2个数组中的公共元素而没有排序输出【英文标题】:How to print common elements in 2 arrays without sorted output in Java 【发布时间】:2017-10-27 19:02:18 【问题描述】:给定两个数组,找出其中的共同元素。
示例:[1,45,33,23,22,45,233,21], [5,23,45,0,9,23,1,9]
=> 输出:[1,45, 23]
import java.io.*;
import java.util.*;
class Mycode
public static void main(String args[])
int a[] = 1, 45, 33, 23, 22, 45, 233, 21;
int b[] = 5, 23, 45, 0, 9, 45, 1, 9;
Mycode test = new Mycode();
test.testNumber(a, b);
void testNumber(int c[], int d[])
System.out.println(Arrays.toString(c));
System.out.println(Arrays.toString(d));
Set<Integer> hset = new HashSet<Integer>();
for (int i = 0; i < c.length; i++)
for (int j = 0; j < d.length; j++)
if (c[i] == d[j])
System.out.println(c[i]);
hset.add(c[i]);
System.out.println(hset);
实际输出:[1, 45, 33, 23, 22, 4, 233, 21] [5, 23, 45, 0, 9, 5, 1, 9]
=>
[1, 23, 45]
【问题讨论】:
How do I get the intersection between two arrays as a new array?的可能重复 @icarumbas 我不会说这是重复的,因为它涉及保留输出元素的顺序 【参考方案1】:HashSet 不保证保留 JavaDoc 中指示的插入顺序:
它不保证集合的迭代顺序;在 特别是,它不保证订单将保持不变 随着时间的推移。
所以我更喜欢使用LinkedHashSet。这个 Set 实现保证了插入顺序的保留。来自 JavaDocs:
这个链表定义了迭代顺序,也就是在 哪些元素被插入到集合中(插入顺序)
void testNumber(int c[], int d[])
System.out.println(Arrays.toString(c));
System.out.println(Arrays.toString(d));
Set<Integer> hset = new LinkedHashSet<>();
for (int i = 0; i < c.length; i++)
for (int j = 0; j < d.length; j++)
if (c[i] == d[j])
hset.add(c[i]);
System.out.println(hset);
输出:
[1, 45, 23]
【讨论】:
感谢胡安卡洛斯。我真的很感激【参考方案2】:您可以使用 哈希映射 循环遍历第一个数组并添加值为 false 的每个元素。 遍历第二个,如果它在 hashMap 中,那么它很常见。
【讨论】:
HashSet 可能吗? HashSet、HashMap、TreeMap。在这种情况下,一切都是一样的,因为从地图中获取或添加元素具有 O(1) 时间复杂度。 HashMap 和 TreeMap 包含两个元素 Key 和 Value。你觉得他应该用什么来做第二个元素? 我最初的想法是使用HashMap,但你是对的。如果他只需要公共元素,那么 HashSet 是最好的。【参考方案3】:下面这样的呢?这样会更整洁,因为您不需要有两个 for 循环,也不需要事先对其进行排序。
public class Mycode
public static void main(String args[])
Integer a[] = 1, 45, 33, 23, 22, 45, 233, 21;
Integer b[] = 5, 23, 45, 0, 9, 45, 1, 9;
Mycode test = new Mycode();
System.out.println(test.testNumber(a, b));
public <T> Set<T> testNumber(T [] arra1, T [] arr2)
Set<T> set1 = new HashSet<T>();
Set<T> interset = new HashSet<T>();
Collections.addAll(set1, arra1);
for(T t: arr2)
if(set1.contains(t))
interset.add(t);
return interset;
【讨论】:
【参考方案4】:List<Integer> list = new ArrayList<>(Arrays.asList(array1));
list.retainAll(Arrays.asList(array2));
System.out.println(list);
【讨论】:
【参考方案5】:时间复杂度为N的解
import java.io.*;
import java.util.*;
public class Main
public static void main(String[] args) throws Exception
// write your code here
Scanner scn = new Scanner(System.in);
int n1 = scn.nextInt();
int[] arr1 = new int[n1];
for (int i = 0; i < n1; i++)
arr1[i] = scn.nextInt();
int n2 = scn.nextInt();
int[] arr2 = new int[n2];
for (int i = 0; i < n2; i++)
arr2[i] = scn.nextInt();
HashMap < Integer, Integer > freqMap1 = new HashMap < > ();
for (int i = 0; i < n1; i++)
int ch = arr1[i];
if (freqMap1.containsKey(ch))
int f = freqMap1.get(ch);
freqMap1.put(ch, f + 1);
else
freqMap1.put(ch, 1);
for (int i = 0; i < n2; i++)
int ch = arr2[i];
if (freqMap1.containsKey(ch))
System.out.println(ch);
freqMap1.remove(ch);
【讨论】:
以上是关于如何在Java中打印2个数组中的公共元素而没有排序输出的主要内容,如果未能解决你的问题,请参考以下文章