java - java中有argsort函数吗?

标签 java arrays sorting

<分区>

我想在数组或数组列表或 Java 中的其他数据结构上使用 argsort 函数,但我在文档中没有找到 argsort 函数。我知道 Collections 类上有一个 sort 方法,但没有任何 argsort 方法。是否有已实现 argsort 方法的类?

最佳答案

我找到了这个类,我希望它是你想要的:

import java.util.Arrays;
import java.util.Comparator;
import java.util.Random;

public final class ArrayUtils {
    public static int[] argsort(final float[] a) {
        return argsort(a, true);
    }

    public static int[] argsort(final float[] a, final boolean ascending) {
        Integer[] indexes = new Integer[a.length];
        for (int i = 0; i < indexes.length; i++) {
            indexes[i] = i;
        }
        Arrays.sort(indexes, new Comparator<Integer>() {
            @Override
            public int compare(final Integer i1, final Integer i2) {
                return (ascending ? 1 : -1) * Float.compare(a[i1], a[i2]);
            }
        });
        return asArray(indexes);
    }

    public static <T extends Number> int[] asArray(final T... a) {
        int[] b = new int[a.length];
        for (int i = 0; i < b.length; i++) {
            b[i] = a[i].intValue();
        }
        return b;
    }

    public static double[] castOf(final float[] x) {
        double[] y = new double[x.length];
        for (int i = 0; i < y.length; i++) {
            y[i] = x[i];
        }
        return y;
    }

    public static int[] castOf(final long[] original) {
        return castOf(original, original.length);
    }

    public static int[] castOf(final long[] original, final int newLength) {
        int[] cast = new int[newLength];
        int length = Math.min(cast.length, original.length);
        for (int i = 0; i < length; i++) {
            long o = original[i];
            if (o < Integer.MIN_VALUE || o > Integer.MAX_VALUE) {
                throw new IllegalArgumentException();
            }
            cast[i] = (int) o;
        }
        return cast;
    }

    public static float[][] copyOf(final float[][] x, final int newLength) {
        float[][] y = new float[newLength][];
        for (int i = 0; i < y.length; i++) {
            if (x[i] != null) {
                y[i] = Arrays.copyOf(x[i], x[i].length);
            }
        }
        return y;
    }

    /**
     * Assigns a random value to each element of the specified array of doubles.
     */
    public static void fillRandom(final double[] x, final Random rng) {
        for (int i = 0; i < x.length; i++) {
            x[i] = rng.nextDouble();
        }
    }

    private ArrayUtils() {
    }
}

链接: Code

关于java - java中有argsort函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31448608/

相关文章:

scala - 我们如何对 Spark RDD 中的数据进行排序和分组?

algorithm - 基本排序运行时间比较

Java Class.forName() 与 Thread.currentThread().getContextClassLoader().loadClass()

java - 将 Double 转换为 Key(优先级队列)

Java命名文件

javascript - 在多个条件下从javascript中的嵌套对象数组中删除数组

java - Tomcat 未在 Windows 中部署最新的 WAR 文件更改

arrays - 如何复制字节数组

jquery - 如何使用jquery从隐藏输入类型数组中获取值

arrays - 将数组拆分为 x 个数组