繁体   English   中英

Java中有序数组的索引

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM