在对数组进行排序时获取元素的等级

时间:2017-03-23 09:10:49

标签: java algorithm sorting lambda java-8

我得到一个数组,我想在数组的排序版本中找到这些元素的位置。因此,输入和输出如下所示

Input : {10, 5, 4, 9, 8, 3, 2, 1,  6, 7}
Output: {0, 3, 4, 9, 8, 1, 2, 5, 6, 7}

这意味着,10将在排序数组中位于第0位,而5将位于第四个索引中,即sortedinput [3]。

这是一个单行的

Arrays.sort(index, (a, b) -> (nums[b] - nums[a]));

该方法如下所示

public Integer[] findIndexInSortedArray(int[] nums) {
        Integer[] index = new Integer[nums.length];

        for (int i = 0; i < nums.length; i++) {
            index[i] = i;
        }

        Arrays.sort(index, (a, b) -> (nums[b] - nums[a]));

        return index;
}

有没有办法,如上所述,不使用lambdas,以及Java 8的任何功能?是否可以仅使用比较器实现此目的?

3 个答案:

答案 0 :(得分:3)

lambda表达式总是可以被它实现的功能接口替换(在你的情况下为Comparator<Integer>)。写作只需要更长时间:

Arrays.sort(index, new Comparator<Integer> () {
                       public int compare (Integer a, Integer b) {
                           return Integer.compare(nums[b],nums[a]);
                       }
            });

答案 1 :(得分:1)

Comparator<T>界面为FunctionalInterface,并标注为注释@FunctionalInterface的界面。

从Java 8开始,您可以像在Arrays.sort方法中一样使用FunctionalInterfaces和Lambda表达式。

表达式可以替换为anonymous inner class而代码正在爆炸,但结果是相同的:

public Integer[] findIndexInSortedArray(int[] nums)
{
    Integer[] index = new Integer[nums.length];

    for (int i = 0; i < nums.length; i++)
    {
        index[i] = i;
    }

    Arrays.sort(index, new Comparator<Integer>()
        {
            @Override
            public int compare(Integer a, Integer b)
            {
                return nums[b] - nums[a];
            }
        });

    return index;
}

答案 2 :(得分:0)

基本理念:

  1. 编写自己的排序算法
  2. 在排序算法的开头,创建一个与要排序的数组大小相同的数组,并填充0,1,2,3,...
  3. 调整您的排序算法,以便每次对要排序的数组执行操作时,它会对新数组执行相同的操作
  4. 返回新数组而不是要排序的数组
  5. 详细说明第3步:如果您使用冒泡排序,例如,每次在要排序的数组中交换元素i和j时,都会使用相同的索引交换新数组中的元素