有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

比较2个int数组中匹配的数字

大家好,有人建议用java比较两个数组的最快方法吗 返回交集数组的字符串 如果没有匹配项,则为“nil”值

static int [] WinnerNumbers; static int [] ClientNumbers;

在执行我的程序之后,我最终得到了两个填充数组(WinnerNumber和ClientNumber),我需要对其中的两个数组进行比较并返回匹配或null

我想通过一个函数来实现这一点

public static String WinnerChecker(){

      prize = (......)

      return prize;
}

共 (3) 个答案

  1. # 1 楼答案

    使用赢家数组创建一个集合。对于客户端的每个号码,请检查该号码是否存在于集合中

    • 集合包含的是O(1)
    • 迭代客户端数组O(N)

    总体复杂度为O(N)

    private static String findWinners(int[] winnerNumbers, int[] clientNumbers) {
        Set<Integer> winnerNumberSet = IntStream.of(winnerNumbers).boxed().collect(Collectors.toSet());
    
        Optional<String> output = IntStream.of(clientNumbers)
                .filter(winnerNumberSet::contains)
                .mapToObj(String::valueOf)
                .reduce((result, element) ->
                        result + ", " + element);
    
        return output.orElse(null);
    }
    
  2. # 2 楼答案

    我会这样做。如果没有交集,它将返回一个空字符串(我猜想您所说的nil

            int[] a = { 1, 2, 4, 3 ,5, 9};
            int[] b = { 4, 5, 6, 7, 8, 9, 11, 12, 13 };
    
            String intersection = getIntersection(a, b);
            System.out.println(intersection);
    
            public static String getIntersection(int[] a, int[] b) {
                return Arrays.stream(a)
                    .flatMap(i -> Arrays.stream(b).filter(k -> i == k))
                    .mapToObj(String::valueOf)
                    .collect(Collectors.joining(""));
            }
    

    印刷品

    459
    

    如果两个数组中都有重复项,并且输出中不需要它们,则在mapToObj进程之前添加方法.distinct()

    如果希望以数组的形式返回结果,下面的方法可以起作用

        public static int[] getIntersection(int[] a, int[] b) {
            return Arrays.stream(a)
                    .flatMap(i -> Arrays.stream(b).filter(k -> i == k))
                    .toArray();
    
        }
    

    另一种可能比上述方法更有效的方法是使用集合

        public static String getIntersection(int[] a, int[] b) {
            Set<Integer> seta =
                    Arrays.stream(a).boxed().collect(Collectors.toSet());
            Set<Integer> setb =
                    Arrays.stream(b).boxed().collect(Collectors.toSet());
    
            seta.retainAll(setb);
            return seta.stream().map(String::valueOf)
                    .collect(Collectors.joining(""));
        }
    

    如果需要,可以返回实际的集合

  3. # 3 楼答案

    希望下面的代码对你有用

     String prize="";
        int[] winnerNumbers={ 23,84,32,98,11};
        int[] clientNumbers ={ 82, 70,81,98,41,32};
        for(int i=0; i< winnerNumbers.length; i++){
            for(int j=0; j< clientNumbers.length; j++){
    
                if(winnerNumbers[i] == clientNumbers[j]){
                    prize = prize + winnerNumbers[i] +" ";
                }
            }
        }
        System.out.println(prize);
    

    这里执行线性搜索操作来定位数字。您可以根据数组大小选择Java8流类或其他搜索算法。有关更多搜索算法,请参阅下面的链接。 https://www.geeksforgeeks.org/check-if-a-value-is-present-in-an-array-in-java/