7

用于检查数组中是否存在元素的简单 Java 代码:

import java.util.Arrays;

public class Main {
    static int[] numbers = {813, 907, 908, 909, 910};

    public static void main(String[] args) {
        int number = 907;
        //Integer number = 907; // the same thing -- it's not found.
        boolean b = Arrays.asList(numbers).contains(number);
        System.out.println(b);  // => false
    }
}

1) 为什么在数组中找不到 907?

2)如果有更好的方法,请继续分享您的知识。

更新:

据说asList将您的int[]转换为List<int[]>具有单个成员的:原始列表。但是,我希望下面的代码给我 1,但它给了我 5:

System.out.println(Arrays.asList(numbers).size());
4

6 回答 6

12

问题是Arrays.asList(numbers)没有按照你的想法去做。它将您int[]转换为List<int[]>具有单个成员的:原始列表。

您可以进行简单的线性搜索,或者,如果您的numbers数组始终是排序的,则使用Arrays.binarySearch(numbers, 907);并测试结果是否为负(表示未找到)。

于 2013-07-07T09:08:36.313 回答
6

列表不包含原语,因此 Arrays.asList(int[]) 将生成一个List类型为 的条目int[]

此代码有效:

static Integer[] numbers = {813, 907, 908, 909, 910};

public static void main(String[] args) {
    Integer number = 907;
    boolean b = Arrays.asList(numbers).contains(number);
    System.out.println(b);  // => false
}

对于您的问题,Arrays.asList(numbers)只要它是一个将包含的内容int[]

这段代码:

static int[] numbers = {813, 907, 908, 909, 910};

public static void main(String[] args) {
    int number = 907;
    List<int[]> list = Arrays.asList(numbers);

    boolean b = list.contains(number);
    System.out.println(b);  // => false
    System.out.println("list: " + list);
    for(int[] next : list) {
        System.out.println("content: " + Arrays.toString(next));
    }
}

有这个结果:

false
list: [[I@da89a7]
content: [813, 907, 908, 909, 910]

如您所见,list包含一个类型元素int[][[I指示int[])。它具有最初创建的元素。

于 2013-07-07T09:03:27.387 回答
2

用番石榴ImmutableSet

public class Main {

    private static final Set<Integer> NUMBERS = ImmutableSet.of(813, 907, 908, 909, 910);

    public static void main(final String[] args) {
        final int number = 907;
        final boolean b = NUMBERS.contains(number);
        System.out.println(b); // true
    }
}

ImmutableSet确保没有人添加任何东西NUMBERS

于 2013-07-07T09:08:24.620 回答
1

由于您的数组已排序,因此您可以使用Arrays.binarySearch().

这使您不必转换为List第一个。检查该方法的返回码:如果为正,则该元素在数组中;如果是负数,则不是:

int number = 907;
System.out.println(Arrays.binarySearch(numbers, number) >= 0);
于 2013-07-07T09:03:43.727 回答
0

请改用此代码。这只是您必须处理 Java 的强类型怪癖的那些时候之一 :)

import java.util.Arrays;

    public class Main {
        static Integer[] numbers = {813, 907, 908, 909, 910};

        public static void main(String[] args) {
        Integer number = new Integer(907);

        boolean b = Arrays.asList(numbers).contains(number);
        System.out.println(b); 
    }
}
于 2013-07-07T10:09:16.413 回答
0

您可以使用 for 循环遍历数组并将每个元素与您要查找的元素匹配。之后你可以从那里去。

因为它不起作用的原因与其他人之前所说的原因相同。

于 2013-07-08T20:16:24.023 回答