在java中按另一个列表的值对多个列表进行排序

zzzyeukh  于 2023-02-14  发布在  Java
关注(0)|答案(2)|浏览(114)

我有6个数组列表,如下所示:

index: 0         1           2          3            4          5

[12345.12   |123.0      |12.12      |1234.0     |123.12     |123.12    ] <Double>
[2000-01-11 |2000-01-11 |2000-01-11 |2000-01-12 |2000-01-12 |2000-01-11] <String>
[1234       | 1234      | 1234      | 1235      | 1235      | 1234     ] <String>
[4          | 10        | 16        | 24        | 30        | 20       ] <Integer>
[7          | 13        | 19        | 27        | 34        | 25       ] <Integer>
[9          | 15        | 21        | 29        | 35        | 40       ] <Integer>

使用Java,我想按照第一个列表中的值降序排列.如果第一个列表中的值相等,则按照第二个列表中对应的值以自然顺序排列两个相等的值.调用Collection.sort(second_list)可以将第二个列表中的字符串以自然顺序排序。

  • (例如:因为索引4和5处的元素相等,所以我必须按照第二个列表中索引4和5处的元素的自然顺序对它们进行排序:123.12 = 123.12但是“2000-01-12”〉“2000-01-11”,所以后两个指数的顺序将是5,4)*

排序后的列表应如下所示:

0            3           5          4            1         2 

[12345.12   |1234.0     |123.12     |123.12     |123.0      |12.12     ] <Double>
[2000-01-11 |2000-01-12 |2000-01-11 |2000-01-12 |2000-01-11 |2000-01-11] <String>
[1234       | 1235      | 1234      | 1235      | 1234      | 1234     ] <String>
[4          | 24        | 20        | 30        | 10        | 16       ] <Integer>
[7          | 27        | 25        | 34        | 13        | 19       ] <Integer>
[9          | 29        | 40        | 35        | 15        | 21       ] <Integer>

我试过构建一个字符串的ArrayList,其中列表中的每个元素都包含一列中的元素,正如我们上面所看到的(例如:在上面的列中的每个元素之后,我用逗号“”连接字符串,以便我可以在排序后拆分字符串(例如:“12345.12,2000 -01- 11,...,9”。由于排序不像我预期的那样工作,我已经放弃了这个计划。
我需要一种表,允许重复值的行。
也许如果第一个List是Map,其中索引是键,值是上面ArrayList中的元素,我可以这样做:

  • 我把Map<Integer, Double>的值按值排序,索引--是键,第一个列表中的元素--是值,所以我得到了索引的顺序:0 3 5 4 1
  • 我按照这个自定义顺序对其他数组列表排序,但是如果Map<Integer, Double>中的值是重复的,我该怎么做?我该如何按照第二个列表中元素的自然顺序对它们排序?

...我需要一个结构,排序快速的名单提到。

jtoj6r0c

jtoj6r0c1#

使用您的值名称创建项目对象:

public class Item {

    private Double value1;

    private String value2;

    private String value3;

    private Integer value4;

    private Integer value5;

    private Integer value6;

    public Double getValue1() {
        return value1;
    }

    public void setValue1(Double value1) {
        this.value1 = value1;
    }

    public String getValue2() {
        return value2;
    }

    public void setValue2(String value2) {
        this.value2 = value2;
    }

    public String getValue3() {
        return value3;
    }

    public void setValue3(String value3) {
        this.value3 = value3;
    }

    public Integer getValue4() {
        return value4;
    }

    public void setValue4(Integer value4) {
        this.value4 = value4;
    }

    public Integer getValue5() {
        return value5;
    }

    public void setValue5(Integer value5) {
        this.value5 = value5;
    }

    public Integer getValue6() {
        return value6;
    }

    public void setValue6(Integer value6) {
        this.value6 = value6;
    }        

}

在其他类中使用以下命令:

public class Test {

    ArrayList<Item> items;

    public Test(){
        items = new ArrayList<>();
        this.dataList();
    }

    public void dataList(){
        Item item = new Item();
        item.setValue1(12345.12);
        item.setValue2("2000-01-11");
        // add all your values
        items.add(item);              
        // do the same for all your objects

        //Sort your list with a custom Comparator
        Collections.sort(items, new Comparator<Item>() {
            @Override
            public int compare(Item item1, Item item2) {
                return item1.getValue1().compareTo(item2.getValue1());
            }
        });        
     }
}
thtygnil

thtygnil2#

这是一个粗略的排序实现,它使用几个独立的等长Comparable列表中的值来创建一个顺序,其中List表示排序键。

public static void sort( List<List<? extends Comparable>> lol ){
    List<Integer> index = new ArrayList<>();
    for( int i = 0; i < lol.get(0).size(); ++i ){
        index.add( i );
    }
    Collections.sort( index, new CompInd( lol, index) );
    for( int i: index ){
        for( int j = 0; j < lol.size(); ++j ){
            System.out.print( " " + lol.get(j).get(i) );
        }
        System.out.println();
    }
}

类CompInd实现n个列表的 * 索引 * 的比较器。

class CompInd implements Comparator<Integer> {
    private List<List<? extends Comparable>> comp;
    private List<Integer> index;
    public CompInd( List<List<? extends Comparable>> comp, List<Integer> index ){
        this.comp = comp;
        this.index = index;
    }

    public int compare(Integer ind1, Integer ind2){
        for( int i = 0; i < comp.size(); ++i ){
            int res = 
                comp.get(i).get(ind1).compareTo( comp.get(i).get(ind2) );
            if( res != 0 ) return res;
        }
        return 0;
    }
}

main方法(从数据中)创建三个List并调用sort。

public static void main( String[] args ){
    List<Double> dl1 = new ArrayList<>();
    for( double d: new double[]{12345.12, 123.0, 12.12, 1234.0, 123.12, 123.12} ){
        dl1.add( d );
    }
    List<String> sl1 = new ArrayList<>();
    for( String s: new String[]{"2000-01-11","2000-01-11","2000-01-11","2000-01-12","2000-01-12","2000-01-11"} ){
        sl1.add( s );
    }
    List<String> sl2 = new ArrayList<>();
    for( String s: new String[]{"1234","1234","1234","1235","1235","1234"} ){
        sl2.add( s );
    }

    List<List<? extends Comparable>> lol = new ArrayList<>();
    lol.add( dl1 );
    lol.add( sl1 );
    lol.add( sl2 );
    sort( lol );
    }
}

这适用于任意数量的并行List,当然,前提是它们都是实现Comparable的对象的List。

相关问题