【问题标题】:How to print common elements in 2 arrays without sorted output in Java如何在Java中打印2个数组中的公共元素而没有排序输出
【发布时间】: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]

【问题讨论】:

标签: java arrays hashset


【解决方案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);
                  }
              }
      
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-22
        • 2013-08-07
        • 1970-01-01
        • 2022-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多