Как найти индекс определенного значения в массиве Java типа int
?
Я попытался использовать Arrays.binarySearch
в моем несортированном массиве, он только иногда дает правильный ответ.
Как найти индекс определенного значения в массиве Java типа int
?
Я попытался использовать Arrays.binarySearch
в моем несортированном массиве, он только иногда дает правильный ответ.
Integer[] array = {1,2,3,4,5,6};
Arrays.asList(array).indexOf(4);
Обратите внимание, что это решение является потокобезопасным, потому что оно создает новый объект типа List.
Также вы не хотите вызывать это в цикле или что-то в этом роде, так как каждый раз вы создаете новый объект
Другим вариантом, если вы используете коллекцию Guava, является 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);
Это отличный выбор, когда пространство, время и повторное использование кода имеют большую ценность. Это также очень красноречиво.
Посмотрите на 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;
}
Скопируйте этот метод в свой класс
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;
}
Вызовите этот метод с помощью pass a passmeters Array и значения и сохраните его возвращаемое значение в целочисленной переменной.
int indexNum = getArrayIndex(array,value);
Спасибо
Вы можете преобразовать его в список, а затем использовать метод indexOf:
Array.asList(array).indexOf(1);
http://download.oracle.com/javase/1.5.0/docs/api/java/util/Arrays.html#asList(T...) http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html#indexOf(java.lang.Object)
Вам нужно отсортировать значения перед использованием двоичного поиска. В противном случае, ручной способ - попробовать все ints на вкладке.
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(значение), чтобы получить индекс.
С уважением, Stéphane
@pst, спасибо за ваши комментарии. Можете ли вы опубликовать другой альтернативный метод?
Вы можете использовать современную Java для решения этой проблемы. Пожалуйста, используйте код ниже:
static int findIndexOf(int V, int[] arr) {
return IntStream.range(1, arr.length).filter(i->arr[i]==V).findFirst().getAsInt();
}
Integer[] arr = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
List<Integer> arrlst = Arrays.asList(arr);
System.out.println(arrlst.lastIndexOf(1));
Простой:
public int getArrayIndex(int[] arr,int value) {
for(int i=0;i<arr.length;i++)
if(arr[i]==value) return i;
return -1;
}
Вы можете либо пройти через массив до тех пор, пока не найдете нужный вам индекс, либо используйте List
. Обратите внимание, что вы можете преобразовать массив в список asList()
.
Вы можете сделать это следующим образом:
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:)
/**
* 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;
}
В основном методе, используемом для циклов: - третий для цикла в моем примере - это ответ на этот вопрос. В моем примере я сделал массив из 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);
}
}
Код выводит все номера и их местоположения и местоположение наименьшего числа, за которым следует наименьшее число.
В случае, если кто-то все еще ищет answer-
Вы можете использовать ArrayUtils.indexOf() из [Apache Commons Library] [1].
Если вы используете 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);
}
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;
}
Бинарный поиск: Бинарный поиск также можно использовать для поиска индекса элемента массива в массиве. Но двоичный поиск можно использовать только в том случае, если массив отсортирован. Java предоставляет нам встроенную функцию, которую можно найти в библиотеке Java-массивов, которая будет возвращать индекс, если элемент присутствует, иначе он возвращает -1. Сложность будет O (log n). Ниже приведена реализация бинарного поиска.
public static int findIndex(int arr[], int t) {
int index = Arrays.binarySearch(arr, t);
return (index < 0) ? -1 : index;
}
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;
}
}