【问题标题】:Sort an Array based on Another Array with different values根据具有不同值的另一个数组对数组进行排序
【发布时间】:2019-06-21 04:29:35
【问题描述】:

我想根据另一个具有不同值的数组对数组进行排序。 考虑以下几点:

参考数组:{"A","B","C"}

获得Array1:{"C","A","B"}
获得Array2:{"cc","aa","bb"}
获得Array3:{"123","asrd","sdhg"}

对应的值

A -> aa and asrd
B -> bb and sdhg
C -> cc and 123

我想按照我的参考数组指定的顺序对获得的数组 1、2 和 3 进行排序。

预期结果:
排序后得到的数组:{"A","B","C"}
排序后得到Array2:{"aa","bb","cc"}
排序后得到Array3:{"asrd","sdhg","123"}

PS:引用数组元素的顺序可以是任何东西([A,B,C][C,B,A] 等)。得到的数组 2 和 3 应该进行相应的排序。

我知道如何按照我的参考数组的顺序对获取的数组 1 进行排序。我尝试了一种逻辑来对获得的数组 2 和 3 进行排序,但我得到的结果是错误的

String[] referenceArray = new String[] { "A", "B", "C" };
String[] obtainedArray1 = new String[] { "C", "A", "B" };
String[] obtainedArray2 = new String[] { "cc", "aa", "bb" };
String[] obtainedArray3 = new String[] { "123", "asrd", "sdhg" };

final List<String> referenceArrayList= Arrays.asList(referenceArray);
ArrayList<String> obtainedArray1_List= new ArrayList<String>(Arrays.asList(obtainedArray1));
ArrayList<String> obtainedArray2_List= new ArrayList<String>(Arrays.asList(obtainedArray2));
ArrayList<String> obtainedArray3_List= new ArrayList<String>(Arrays.asList(obtainedArray3));


// Sorting ObtainedArray1_List - This works Fine
Collections.sort(obtainedArray1_List, Comparator.comparing(s -> referenceArrayList.indexOf(s)));

//Sorting obtainedArray2_List - Not Working
Collections.sort(obtainedArray2_List, Comparator.comparing(s -> referenceArrayList.indexOf(obtainedArray1[obtainedArray2_List.indexOf(s)])));

得到Array2_List排序后的结果:["aa","cc","bb"]

预期结果是["aa","bb","cc"]

【问题讨论】:

  • 不使用 OO 设计会使自己的生活变得复杂。您应该拥有一个对象数组(或列表,最好是),而不是拥有 3 个并行数组。每个对象将具有三个属性(第一个属性值为“A”、“aa”、“asrd”),然后您只需按其引用属性对对象列表进行排序。 Java 是一种面向对象的语言。定义类,并使用对象。

标签: java java-8 java-stream


【解决方案1】:

正如 JB Nizet 已经说过的,你让你的生活变得复杂。您有三个独立的数组,而它们的内容是相关的。你是说Aaaasrd属于同一类,还有BbbsdhgCcc123

这些可以被认为是单个对象的三个属性。这就是面向对象的重点。您应该定义一个代表这三个属性的类:

public class Holder {

    private String letter;
    private String lower;
    private String text;

    public Holder(String letter, String lower, String text) {
        this.letter = letter;
        this.lower = lower;
        this.text = text;
    }

    public String getLetter() {
        return this.letter;
    }

    @Override
    public String toString() {
        return String.format("Holder(letter=%s, lower=%s, text=%s)",
            this.letter, this.lower, this.text);
    }
}

你的三个数组一开始就不应该存在,而是一个包含Holder 对象的数组或集合。为方便起见,这里是对List&lt;Holder&gt; 的转换。

List<Holder> holders = IntStream.range(0, obtainedArray1.length)
    .mapToObj(i -> new Holder(obtainedArray1[i], obtainedArray2[i], obtainedArray3[i]))
    .collect(Collectors.toList());

现在您可以简单地排序收集一个新的排序列表,而不是三个单独的排序数组。

List<String> referenceList = Arrays.asList("A", "B", "C");
List<Holder> sorted = holders.stream()
    .sorted(Comparator.comparing(t -> referenceList.indexOf(t.letter)))
    .collect(Collectors.toList());

【讨论】:

    猜你喜欢
    • 2022-12-18
    • 2015-08-05
    • 1970-01-01
    • 2015-04-17
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多