Java中有序数组的索引

时间:2014-03-04 05:16:10

标签: java arrays

如何在Java中编写已排序数组的索引?

例如:

  int[] myIntArray = new int[]{20,100,69,4};

Arrays.sort(myIntArray)结果是:

{4,20,69,100}

如果需要index原始数组怎么办?

表示:

{3,0,2,1}

5 个答案:

答案 0 :(得分:3)

如果我理解你的问题。

考虑到您的数组中没有重复项。对数组进行排序后。

选项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)

然后,

如果您想将这些索引存储在数组中,请使用具有初始数组长度的数组,并使用返回的索引填充该数组。

答案 1 :(得分:2)

我认为这样做的方法是创建一个类&#34; intWithIndex&#34;实施可比较。通过这种方式,您可以跟踪索引。

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应该可以工作,你可以用索引字段检查初始索引。

你明白我的意思吗?

答案 2 :(得分:2)

声明一个包含索引和值的类,并设置一个只比较值的比较器。

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对象,它们将索引与值保持在一起。

(P.S。没有经过测试,所以我可能会拙劣一些语法......)

(PPS。公共数据成员通常都是邪恶的,但我认为对于像这样的小类来说,这样做的目的只是将几个值放在一起。但如果你不喜欢它,那就把它们设为私有并使用存取器方法。)

答案 3 :(得分:0)

@SURESH ATTA的附加内容,您可以使用Map来定义数据结构,密钥将保存为索引,值将是您的整数。

答案 4 :(得分:0)

在不使用任何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;
    }
}