如何在int数组中找到元素的索引?


78

如何在类型为Java的数组中找到某个值的索引int

我尝试Arrays.binarySearch在未排序的数组上使用,但有时只能给出正确的答案。


11
二进制搜索将永远无法在未排序的数组上运行。
克里斯·埃伯勒

那你能建议我一些事情,我应该怎么做。因为如果我对数组进行排序,则会失去对索引的跟踪,并且我需要知道该值来自哪个索引?
约马克2011年

编辑:我忘了添加,我还需要找到双精度值的数组索引。
约马克2011年

1
如果您不想对数组进行排序,则只需使用简单的for循环即可找到该值。
杰米·柯蒂斯

2
通常最好阅读函数文档:)从binarySearch:“使用二进制搜索算法在...的指定数组中搜索指定的值。必须先对数组进行排序(例如通过sort(long [])方法)进行此调用。如果未排序,则结果不确定。...“

Answers:


130
Integer[] array = {1,2,3,4,5,6};

Arrays.asList(array).indexOf(4);

请注意,此解决方案是线程安全的,因为它创建了类型为List的新对象。

另外,您也不想循环或类似地调用它,因为每次都会创建一个新对象


谢谢,但是可以用于double型吗?抱歉,我忘了在问题中提及,但是我还需要针对double值进行处理。但是,它可以与int一起正常工作。
约马克2011年

是的,您不必更改任何内容(但显然无需更改数组类型)
Pablo Fernandez

54
实际上,代码不起作用。检查为什么indexOf找不到对象?
teloon 2012年

13
您需要将数组转换为Integer []而不是int []。基本数组未自动装箱。
莱昂·赫尔姆斯利

1
这真的是线程安全的吗?当我单击源代码时,List.asList()创建一个ArrayList,它直接将int数组作为数据容器(不进行复制)
Langusten Gustel,2016年

26

如果您使用的是番石榴集合,则另一个选择是Ints.indexOf

// Perfect storm:
final int needle = 42;
final int[] haystack = [1, 2, 3, 42];

// Spoiler alert: index == 3
final int index = Ints.indexOf(haystack, needle);

当空间,时间和代码重用非常宝贵时,这是一个不错的选择。这也很简洁。


20

看一下API,它说您必须先对数组进行排序

所以:

Arrays.sort(array);
Arrays.binarySearch(array, value);

如果不想对数组排序:

public int find(double[] array, double value) {
    for(int i=0; i<array.length; i++) 
         if(array[i] == value)
             return i;
}

7
1然而,应当注意的是,Arrays.sort 变异的输入和原始阵列将被修改。

谢谢,第二种方法为添加具有不同索引的重复值添加了一些逻辑之后,以某种方式对我起作用。
约马克2011年

14

将此方法复制到您的班级中

 public int getArrayIndex(int[] arr,int value) {

        int k=0;
        for(int i=0;i<arr.length;i++){

            if(arr[i]==value){
                k=i;
                break;
            }
        }
    return k;
}

通过传递两个性能参数Array和value来调用此方法,并将其返回值存储在整数变量中。

int indexNum = getArrayIndex(array,value);

谢谢


6
ArrayUtils.indexOf(array, value);
Ints.indexOf(array, value);
Arrays.asList(array).indexOf(value);

3
虽然这段代码可以解决问题,但包括解释如何以及为什么解决该问题的说明,确实可以帮助提高您的帖子质量,并可能导致更多的投票。请记住,您将来会为读者回答问题,而不仅仅是现在问的人。请编辑您的答案以添加说明,并指出适用的限制和假设。
哔哔声,

4

您可以使用现代Java解决此问题。请使用以下代码:

static int findIndexOf(int V, int[] arr) {
        return IntStream.range(1, arr.length).filter(i->arr[i]==V).findFirst().getAsInt();
    }

大!感谢分享。它有助于了解语言功能上下文中的新(优化)内置解决方案。
吉列尔莫·加西亚


3

使用二进制搜索之前,需要对值进行排序。否则,手动方法是尝试选项卡中的所有整数。

public int getIndexOf( int toSearch, int[] tab )
{
  for( int i=0; i< tab.length ; i ++ )
    if( tab[ i ] == toSearch)
     return i;

  return -1;
}//met

一种替代方法是将每个索引的所有索引映射到映射中。

tab[ index ] = value;
if( map.get( value) == null || map.get( value) > index )
    map.put( value, index );

然后map.get(value)获取索引。

问候,斯特凡

@pst,感谢您的评论。您可以发布其他替代方法吗?


这是一种方式,是的。但是,这不是唯一的方法。这里使用布尔变量found是无用的(并且不使用),应将其删除。+1用于显示“手动循环方法”(不包括样式和格式问题)。

2

简单:

public int getArrayIndex(int[] arr,int value) {
    for(int i=0;i<arr.length;i++)
        if(arr[i]==value) return i;
    return -1;
}

2
    Integer[] arr = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
    List<Integer> arrlst = Arrays.asList(arr);
    System.out.println(arrlst.lastIndexOf(1));

注意,数组必须是Integer [],而不是int []。至少,indexOf()仅适用于Integer
djdance,

1

如果有人还在寻找答案,

  1. 您可以使用[Apache Commons Library] [1]中的ArrayUtils.indexOf()。

  2. 如果您使用的是Java 8,则还可以使用Strean API:

    public static int indexOf(int[] array, int valueToFind) {
        if (array == null) {
            return -1;
        }
        return IntStream.range(0, array.length)
                .filter(i -> valueToFind == array[i])
                .findFirst()
                .orElse(-1);
    }
    

    [1]:https : //commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html#indexOf(int [],% 20int)


1

最简单的方法是进行迭代。例如,我们要查找数组及其索引的最小值:

public static Pair<Integer, Integer> getMinimumAndIndex(int[] array) {
        int min = array[0];
        int index = 0;
        for (int i = 1; i < array.length; i++) {
            if (array[i] < min) {
                min = array[i];
                index = i;
            }

            return new Pair<min, index>;

这样,您可以测试所有数组值,如果其中一些值是最小值,则您还将知道最小值索引。搜索某些值可以相同:

public static int indexOfNumber(int[] array) {
        int index = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == 77) {        // here you pass some value for example 77
                index = i;
            }
        }
        return index;
    }

0

您可以遍历数组直到找到所需的索引,或者改用a List。请注意,您可以使用将数组转换为列表asList()


0
/**
     * Method to get the index of the given item from the list
     * @param stringArray
     * @param name
     * @return index of the item if item exists else return -1
     */
    public static int getIndexOfItemInArray(String[] stringArray, String name) {
        if (stringArray != null && stringArray.length > 0) {
            ArrayList<String> list = new ArrayList<String>(Arrays.asList(stringArray));
            int index = list.indexOf(name);
            list.clear();
            return index;
        }
        return -1;
    }

clearnew ArrayList是不必要的操作。分配一个新ArrayList副本会复制整个数组,这是没有意义的,因为Arrays.asList已经返回了一个List具有indexOf方法的数组。无需清除列表的副本,GC仍将其删除。
TWiStErRob 2015年

0

您可以这样做:

 public class Test {

public static int Tab[]  = {33,44,55,66,7,88,44,11,23,45,32,12,95};
public static int search = 23;

public static void main(String[] args) {
    long stop = 0;
    long time = 0;
    long start = 0;
    start = System.nanoTime();
    int index = getIndexOf(search,Tab);
    stop = System.nanoTime();
    time = stop - start;
    System.out.println("equal to took in nano seconds ="+time);
    System.out.println("Index  of searched value is: "+index);
    System.out.println("De value of Tab with searched index is: "+Tab[index]);
    System.out.println("==========================================================");
    start = System.nanoTime();
    int Bindex = bitSearch(search,Tab);
    stop = System.nanoTime();
    time = stop - start;
    System.out.println("Binary search took nano seconds ="+time);
    System.out.println("Index  of searched value is: "+Bindex);
    System.out.println("De value of Tab with searched index is: "+Tab[Bindex]);
}



public static int getIndexOf( int toSearch, int[] tab ){
     int i = 0;
     while(!(tab[i] == toSearch) )
     {  i++; }
       return i; // or return tab[i];
   }
public static int bitSearch(int toSearch, int[] tab){
    int i = 0;
    for(;(toSearch^tab[i])!=0;i++){
    }
    return i;

}

}

添加了XOR :)


tab.equals(toSearch)正在将数组与int进行比较。也许tab[i] == toSearch代替。
Mike Samuel

感谢Mike。这项工作非常有效... Google进行了二进制搜索,提供了一些不错的文章及其有趣的方法
Andre

@Andre,如果您想证明一个观点,请给他们一个公平的竞争环境(相同的顺序,相同的控制流程): while (tab[i] != toSearch) i++; VS while ((tab[i] ^ toSearch) != 0) i++;
TWiStErRob 2015年

1
在任何情况下,这种计时方式都行不通,对我而言bitSearch总是比getIndexOf; 而如果我只是将调用交换为两种方法getIndexOf速度会比bitSearch。这清楚地表明,由于JVM内部原因,第二个总是更快。您应该多次重复实验(可能数百万次),取平均值,舍弃极值并进行与测试非常相似的预热。
TWiStErRob 2015年

0

在使用for循环的主要方法中:-在我的示例中,第三个for循环是该问题的答案。-在我的示例中,我制作了一个由20个随机整数组成的数组,为变量分配了最小的数字,并在计算循环数的同时当数组的位置达到最小值时停止了循环。

import java.util.Random;
public class scratch {
    public static void main(String[] args){
        Random rnd = new Random();
        int randomIntegers[] = new int[20];
        double smallest = randomIntegers[0];
        int location = 0;

        for(int i = 0; i < randomIntegers.length; i++){             // fills array with random integers
            randomIntegers[i] = rnd.nextInt(99) + 1;
            System.out.println(" --" + i + "-- " + randomIntegers[i]);
        }

        for (int i = 0; i < randomIntegers.length; i++){            // get the location of smallest number in the array 
            if(randomIntegers[i] < smallest){
                smallest = randomIntegers[i];                 
            }
        }

        for (int i = 0; i < randomIntegers.length; i++){                
            if(randomIntegers[i] == smallest){                      //break the loop when array location value == <smallest>
                break;
            }
            location ++;
        }
        System.out.println("location: " + location + "\nsmallest: " + smallest);
    }
}

代码输出所有数字及其位置,以及最小数字后跟最小数字的位置。


0
static int[] getIndex(int[] data, int number) {
    int[] positions = new int[data.length];
    if (data.length > 0) {
        int counter = 0;
        for(int i =0; i < data.length; i++) {
            if(data[i] == number){
                positions[counter] = i;
                counter++;
            }
        }
    }
    return positions;
}

0

二进制搜索:二进制搜索还可用于查找数组中数组元素的索引。但是二进制搜索只能在数组排序后使用。Java为我们提供了一个内置函数,可以在Java的Arrays库中找到该函数,如果存在该元素,它将返回索引,否则返回-1。复杂度将为O(log n)。下面是二进制搜索的实现。

public static int findIndex(int arr[], int t) { 
   int index = Arrays.binarySearch(arr, t); 
   return (index < 0) ? -1 : index; 
} 

-2
Integer[] array = {1, 2, 3, 4, 5, 6};

for (int i = 0; i < array.length; i++) {
    if (array[i] == 4) {
        system.out.println(i);
        break;
    }
}

3
重复的答案。
betontalpfa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.