Java中有序数组的索引

Java中有序数组的索引,java,arrays,Java,Arrays,如何在Java中获得排序数组的索引 例如: int[] myIntArray = new int[]{20,100,69,4}; 和Arrays.sortmyIntArray结果为: {4,20,69,100} 如果需要原始数组的索引,该怎么办 这意味着: {3,0,2,1}如果我正确理解了你的问题 考虑到数组中没有重复项。在对数组排序之后 备选案文1: 编写一个小助手方法 将每个值传递给下面的方法并获取其索引 public int findIndex(int[] iarray, int

如何在Java中获得排序数组的索引

例如:

  int[] myIntArray = new int[]{20,100,69,4};
和Arrays.sortmyIntArray结果为:

{4,20,69,100}
如果需要原始数组的索引,该怎么办

这意味着:


{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;
}
那么


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

如果我正确理解了您的问题

考虑到数组中没有重复项。在对数组排序之后

备选案文1:

编写一个小助手方法

将每个值传递给下面的方法并获取其索引

public int findIndex(int[] iarray, int value) {
    for(int i=0; i<iarray.length; i++) 
         if(iarray[i] == value)
             return i;
}
那么


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

我认为一种方法是创建一个类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[]。排序应该可以工作,您可以使用索引字段检查初始索引


你明白我的意思了吗?

我认为一种方法是创建一个类intWithIndex实现Comparable。这样,您就可以快速跟踪索引

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[]。排序应该可以工作,您可以使用索引字段检查初始索引


你明白我的意思了吗?

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

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);
    }
}
现在,当您在myIVArray上调用sort时,它将使用比较器进行排序,这意味着它将比较这些值。但是结果数组包含IndexAndValue对象,这将使索引和值保持在一起

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);
    }
}
p.S.没有测试,所以我可能弄错了一些语法


PPS。公共数据成员通常是邪恶的,但我认为对于像这样的一个小类来说,它的目的只是将几个值保存在一起是可以的。但是如果您不喜欢,请将它们设置为私有并使用访问器方法。

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

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);
    }
}
现在,当您在myIVArray上调用sort时,它将使用比较器进行排序,这意味着它将比较这些值。但是结果数组包含IndexAndValue对象,这将使索引和值保持在一起

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);
    }
}
p.S.没有测试,所以我可能弄错了一些语法


PPS。公共数据成员通常是邪恶的,但我认为对于像这样的一个小类来说,它的目的只是将几个值保存在一起是可以的。但如果您不喜欢,请将它们设置为私有并使用访问器方法。

除了@SURESH ATTA之外,您还可以使用它来定义数据结构,键将保存为索引,值将是整数

除了@SURESH ATTA之外,您还可以使用它来定义数据结构,键是另存为索引,值是整数

在不使用任何库的情况下获取排序值的索引数组。还要注意重复/多个数组元素

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;
    }
}

在不使用任何库的情况下获取排序值的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;
    }
}


索引是常量。价值变化。请告诉我们,你们面临的实际问题是什么。我正在寻找一个函数,它返回原始矩阵的索引。假设:Arrays.ordermyIntArray={3,0,2,1}维护原始数组的副本,这将比创建包装类的开销更小。只需调用array.clone.index就可以了。价值变化。请告诉我们,你们面临的实际问题是什么。我正在寻找一个函数,它返回原始矩阵的索引。假设:Arrays.ordermyIntArray={3,0,2,1}维护原始数组的副本,这将比创建包装类的开销更小。只需调用array.clone.No:更多解释请No:更多解释请+1表示简单,但如果数组中有任何重复值,它将始终返回出现该值的第一个索引at@mdewitt:对于您提到的场景,我假设OP必须是智能的enuf才能遍历整个数组并保持找到的值的索引位置!!:@值得一提的是,+1表示简单,但如果数组中有任何重复值,它将始终返回值出现的第一个索引at@mdewitt:对于前面提到的场景,我假设OP必须是smart-enuf才能遍历整个数组并保持找到的值的索引位置!!:@mdewitt这一点值得一提。+1因为这涉及到为数组中的重复值返回正确的原始索引。如何生成IndexAndValue?构建包含索引和值的对象的IndexAndValue数组??
+1因为这涉及为数组中的重复值返回正确的原始索引,所以如何生成IndexAndValue?构建包含索引和值的对象的IndexAndValue数组??