![](/img/trans.png)
[英]Java binary search in a ordered array of strings ArrayIndexOutOfBoundsException
[英]Index of ordered array in Java
如何在Java中获得排序数组的索引?
例如:
int[] myIntArray = new int[]{20,100,69,4};
和Arrays.sort(myIntArray)
结果是:
{4,20,69,100}
如果需要原始数组的index
怎么办?
意思是 :
{3,0,2,1}
如果我正确理解您的问题。
考虑到数组中没有重复项 。 对数组排序之后。
选项1:
编写一个小的辅助方法。
将每个值传递给以下方法并获取其索引。
public int findIndex(int[] iarray, int value) {
for(int i=0; i<iarray.length; i++)
if(iarray[i] == value)
return i;
}
选项2:
使用org.apache.commons.lang Class ArrayUtils
public static int indexOf(int[] array,
int valueToFind)
然后,
如果要将这些索引存储在数组中,请使用具有初始数组长度的数组,然后用返回的索引填充该数组。
我认为一种方法是创建一个实现Comparable的“ intWithIndex”类。 这样,您可以跟踪索引。
public class IntWithIndex implements Comparable<IntWithIndex>{
public int value;
public int index;
@Override
Public int compareTo(intWithIndex x) {
return value - x.value;
}
}
public Test {
IntWithIndex[] myArray = ...
myArray[].sort;
}
然后,IntWithIndex []。sort应该可以工作,并且您可以使用index字段检查初始索引。
你明白我的意思吗?
声明一个包含索引和值的类,并设置一个仅比较值的比较器。
class IndexAndValue implements Comparable<IndexAndValue> {
public int index;
public int value;
public IndexAndValue(int index, int value) {
this.index = index;
this.value = value;
}
@Override
public int compareTo(IndexAndValue other) {
return Integer.compareTo(value, other.value);
}
}
构建包含索引和值的对象的IndexAndValue
数组。
IndexAndValue[] myIVArray = new IndexAndValue[myIntArray.length];
for (int i = 0; i < myIntArray.length, i++)
myIVArray[i] = new IndexAndValue(i, myIntArray[i]);
现在,当您在myIVArray上调用sort时,它将使用比较器进行排序,这意味着它将比较这些值。 但是结果数组包含IndexAndValue对象,该对象将使索引与值保持在一起。
(PS未经过测试,所以可能我弄虚了一些语法...)
(PPS。公共数据成员通常是邪恶的,但我认为对于这样的小类来说,这是可以的,其目的只是将几个值放在一起。但是,如果您不喜欢它,请将它们设为私有并使用访问器方法。
除了@SURESH ATTA,您还可以使用Map定义数据结构,该键将另存为索引,而值将为整数。
在不使用任何lib的情况下获得排序值的indexArray。 还要注意重复/多个数组元素。
import java.util.Arrays;
public class IndexCal {
public static void main(String args[]) {
int[] myIntArray = new int[] { 20, 100, 69, 4, 20, 4, 100 };
int[] copyArray = new int[myIntArray.length];
System.arraycopy(myIntArray, 0, copyArray, 0, myIntArray.length);
Arrays.sort(myIntArray);
int[] indexArray = new int[myIntArray.length];
Arrays.fill(indexArray, -1);
for (int i = 0; i < copyArray.length; i++) {
int skiplength = 0;
int index = find(copyArray, myIntArray[i], 0);
while(find(indexArray, index, 0) != -1){
index = find(copyArray, myIntArray[i], skiplength++);
}
indexArray[i] = index;
}
for (int i = 0; i < copyArray.length; i++) {
System.out.println(indexArray[i]);
}
}
public static int find(int[] array, int value, int skiplength) {
for (int i = 0; i < array.length; i++)
if (array[i] == value)
if(skiplength == 0)
return i;
else
skiplength--;
return -1;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.