java中有argsort函数吗?

java中有argsort函数吗?,java,arrays,sorting,Java,Arrays,Sorting,我想在Java中的数组、arraylist或其他数据结构上使用argsort函数,但在文档中找不到argsort函数。我知道在Collections类上有一个sort方法,但是没有任何argsort方法。是否有任何类已经实现了argsort方法?我找到了这个类,希望它是您想要的: import java.util.Arrays; import java.util.Comparator; import java.util.Random; public final class ArrayUtils

我想在Java中的数组、arraylist或其他数据结构上使用
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() {
    }
}
导入java.util.array;
导入java.util.Comparator;
导入java.util.Random;
公开期末班{
公共静态int[]argsort(最终浮点值[]a){
返回argsort(a,true);
}
公共静态int[]argsort(最终浮点[]a,最终布尔升序){
整数[]索引=新整数[a.length];
for(int i=0;iInteger.MAX_值){
抛出新的IllegalArgumentException();
}
投射[i]=(int)o;
}
回浇;
}
公共静态浮点值[][]copyOf(最终浮点值[][]x,最终整数newLength){
float[][]y=新的float[newLength][];
对于(int i=0;i

链接:

从2017年起,您可以找到一个(可能是与numpy最接近的Java等价物)。它没有在2017年的0.9.1版本中发布,但看起来它将在即将发布的0.9.2版本中发布。该代码实际上是从JetStream复制到其答案中的array4j代码派生而来的。array4j现在似乎被放弃了,所以一旦argsort发布了ND4J,它可能会更受欢迎。一旦发布了0.9.2,您就可以从中安装它

顺便说一句,你在评论JetStream的回答时提到

我想知道为什么没有使用这个argsort方法的类。例如,它存在于Python numpy中


这不是一个公平的比较,因为numpy不是Python标准库的一部分,就像ND4J对于Java一样。这两种语言都没有在标准库中包含argsort,而且都在第三方库中提供它。

我知道argsort的功能,它返回将对数组排序的索引。我只是在寻找一个已经实现了这个方法的类,也许这个源代码可以帮助你:我也能用java编写这个方法,这不是很难,但我在寻找一个实现它的类,比如排序方法……我已经找到了(在问我的问题之前,我也在网上做了一些研究),但是我想知道为什么没有使用这个argsort方法的类。它存在于PythonNumpy中,例如…@fonfonx是的,我知道,但不是在Java中,因为它看起来是这样的:D只是使用这个。哦,这个问题现在有答案了吗?还是我们应该继续寻找它D您能否只添加代码的相关部分并稍加解释。粘贴你没有写的代码不是答案。@Hacketo我从来没有说过我写了这段代码,我不明白他真正想要什么,所以我粘贴了这段代码,并添加了到原始siteRelax的链接,我只是想知道其中是否有一个类可以用argsort方法导入,方式与我编写的
import java.util.Arrays相同
Arrays.sort(…)
但是似乎没有
Arrays.argsort(…)
。但是,我写了一些代码来实现它,这没关系,但是如果不重新编写它,会更容易一些。。。