【问题标题】:Checking whether an element exist in an array检查数组中是否存在元素
【发布时间】:2013-07-07 09:00:39
【问题描述】:

用于检查数组中是否存在元素的简单 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());

【问题讨论】:

  • 您是否尝试过使用 Integer number = 907; ?
  • 女巫是你的问题?
  • 不,int 不代表Integer。第一个是原始类型,第二个是对象。
  • @user2511414,哇,这真是个好主意,为此使用线程。 :p
  • “但是,我希望下面的代码给我 1,但它给了我 5” - 我认为你犯了一个错误。当我将该语句添加到您的程序并运行它时,它显示“1”。

标签: java


【解决方案1】:

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

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

【讨论】:

  • 它正在将您的 int[] 转换为具有单个成员的 List:原始列表。 --对不起,我没有得到这个。
  • .asList(num) 表示“作为列表”。你不应该期望一个名为 .asList(num) 的方法会返回一个数组...
  • @MariusKavansky - 好吧,System.out.println(Arrays.asList(numbers).size()); 为我打印 1。你确定你没有把numbers的声明改成Integer[]吗?
【解决方案2】:

列表不包含原语,因此 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[])。它具有最初创建的元素。

【讨论】:

  • 有一个 int[] 类型的条目 -- 这个条目的值是多少?
  • @MariusKavansky 原始数组。我会更新我的答案来解释。
【解决方案3】:

用番石榴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 添加任何内容

【讨论】:

    【解决方案4】:

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

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

    int number = 907;
    System.out.println(Arrays.binarySearch(numbers, number) >= 0);
    

    【讨论】:

    • 嗯,好的,我要测试一下;但是,如果这是一个排序数组,我的方法对你有用。删除不相关的部分。
    【解决方案5】:

    请改用此代码。这只是你必须处理 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); 
        }
    }
    

    【讨论】:

    • 你确实注意到你的答案和我的一模一样?
    • 不是真的,对象 vs 符号...也有点短
    【解决方案6】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-23
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 2011-11-14
      • 2010-12-30
      • 2018-02-23
      • 1970-01-01
      • 2018-02-24
      相关资源
      最近更新 更多