Java - 根据一个数组的值对另一个数组进行排序?

2022-09-04 06:13:39

我有一个字符串数组,它们是来自外部代码的类的实例,我宁愿不更改它们。

我还有一个 int 数组,它是通过在每个对象上调用一个函数而生成的。所以我有

一个:[string1, string2, string3]

B:[40, 32, 34]

我如何轻松地对A进行排序,以便按B的值对其进行排序。我有可用的提升。我想对A进行排序,使其按顺序排列:

[string2, string3, string1]

在javascript中,你可以这样做:

B.sort(function(a,b){return A[B.indexOf(a)] < A[B.indexOf(b)];});

答案 1

在java 8中,你可以这样做

使用 lambda:

    String[] strings = new String[]{"string1", "string2", "string3"};
    final int[] ints = new int[]{40, 32, 34};

    final List<String> stringListCopy = Arrays.asList(strings);
    ArrayList<String> sortedList = new ArrayList(stringListCopy);
    Collections.sort(sortedList, (left, right) -> ints[stringListCopy.indexOf(left)] - ints[stringListCopy.indexOf(right)]);

或者更好,使用比较器

    String[] strings = new String[]{"string1", "string2", "string3"};
    final int[] ints = new int[]{40, 32, 34};

    final List<String> stringListCopy = Arrays.asList(strings);
    ArrayList<String> sortedList = new ArrayList(stringListCopy);
    Collections.sort(sortedList, Comparator.comparing(s -> ints[stringListCopy.indexOf(s)]));

答案 2

简短的回答:我建议创建一个单独的类,其中包含有关实际和提升() 的信息。如果您假设以下情况:Stringint

public class BoostString {
    int boost;
    String str;

    public BoostString(int boost, String str) {
        this.boost = boost;
        this.str = str;
    }
}

然后,您可以使用 a 对数组进行排序,它与 Java 8 流 API 配合使用特别好。Comparator

String[] strings = {"string1", "string2", "string3"};
int[] boosts = {40, 32, 34};

final String[] sorted = IntStream.range(0, boosts.length)
        .mapToObj(i -> new BoostString(boosts[i], strings[i])) // Create the instance
        .sorted(Comparator.comparingInt(b -> b.boost))         // Sort using a Comparator
        .map(b -> b.str)                                       // Map it back to a string
        .toArray(String[]::new);                               // And return an array

上面示例中的 方法是使用该方法创建的,该方法是使用 Java 8 创建 for ints 的便捷方法。ComparatorComparator.comparingIntComparator


解释:通常,在 Java 中比较对象时,可以使用内置排序函数之一,例如在何处提供自己的 .界面很简单,看起来像这样:Collections.sortComparatorComparator

public interface Comparator<T> {
    int compare(T o1, T o2);

    // Other default methods for Java 8
}

返回值的类型在 JavaDoc 中是这样描述的int

返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个参数。

当您对s或(或实际上)进行排序时,这是开箱即用的,因为它们是 - 它们具有内置的自然排序,对于s,这是按字母顺序排序的,并且对于它按升序排序(请参阅JavaDoc)。StringintIntegerComparableStringIntegersComparable

另外,如果您使用的是第三方库,则还有其他“配对”或“元组”实现可用。您不必创建自己的 a 和 的“对”。一个例子是Apache CommonsFair类。Stringint