加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 我可以将两个列表相互排序吗?

发布时间:2020-12-15 07:36:41 所属栏目:Java 来源:网络整理
导读:我在 python中进行原型设计并且我使用了zip函数,我不知道如何在 Java中执行此操作.基本上我有两个列表(一个是名称,一个是数据),并希望它们相互排序.我的程序只处理一个列表(数据,在这种情况下),但我使用名称作为我正在处理的数据的参考,我想尝试以不同的顺序
我在 python中进行原型设计并且我使用了zip函数,我不知道如何在 Java中执行此操作.基本上我有两个列表(一个是名称,一个是数据),并希望它们相互排序.我的程序只处理一个列表(数据,在这种情况下),但我使用名称作为我正在处理的数据的参考,我想尝试以不同的顺序处理我的数据.这是一个结构的例子(实际上我的数据不是存储给我的,但我会对它进行基本排序或反向排序,没什么特别的).

String[] names = new String[] {"Monkey1","Dog2","Horse3","Cow4","Spider5"};
int[] data = new int[] {1,2,3,4,5};

所以相反的是

name = Spider5,Cow4,Horse3,Dog2,Monkey1
data = 5,1

我发现了这个问题:Is there an accepted Java equivalent to Python’s zip()?但我宁愿(如果可能的话,对于胆小的人)使用我已经拥有的库(Java commons,apache commons等)来做这件事.如果没有其他方法,那么我将给功能java一个镜头.有什么建议?

解决方法

这是完整的代码:

StringIntTuple.java:

public class StringIntTuple{
    public final int intValue;
    public final String stringValue;
    public StringIntTuple(int intValue,String stringValue){
        this.intValue = intValue;
        this.stringValue = stringValue;
    }
    public String toString(){
        return "(" + this.intValue + "," + this.stringValue + ")";
    }

}

StringIntTupleStringComparator.java:

import java.util.Comparator;


public class StringIntTupleStringComparator implements
        Comparator<StringIntTuple> {

    @Override
    public int compare(StringIntTuple a,StringIntTuple b) {
        // TODO Auto-generated method stub
        return a.stringValue.compareTo(b.stringValue);
    }

}

StringIntTupleIntComparator.java:

import java.util.Comparator;


public class StringIntTupleIntComparator implements Comparator<StringIntTuple> {

    @Override
    public int compare(StringIntTuple a,StringIntTuple b) {
        return ((Integer)a.intValue).compareTo((Integer)b.intValue);
    }

}

Driver.java:

import java.util.ArrayList;
import java.util.Collections;


public class Driver {

    /**
     * @param args
     */
    public static String[] names = new String[] {"Monkey1","Spider5"};
    public static int[] data = new int[] {1,5};
    public static void main(String[] args) {
        ArrayList<StringIntTuple> list = new ArrayList<StringIntTuple>();
        for(int i =0; i<names.length; i++){
            list.add(new StringIntTuple(data[i],names[i]));
        }
        Collections.sort(list,new StringIntTupleIntComparator());
        System.out.println(list.toString());
        Collections.sort(list,new StringIntTupleStringComparator());
        System.out.println(list.toString());
    }


}

输出(首先按int字段排序,然后按字符串字段排序):

[(1,Monkey1),(2,Dog2),(3,Horse3),(4,Cow4),(5,Spider5)]

[(4,(1,Spider5)]

编辑1(额外信息):

如果你想让任何元组工作,即不将字段类型约束为int,String,你可以简单地用泛型做同样的操作,即:

public class Tuple<A,B>{
    public Tuple(A aValue,B bValue){
        this.aValue = aValue;
        this.bValue = bValue;
    }
    public final A aValue;
    public final B bValue;

}

然后,只需相应地调整比较器,你就有了一个通用的解决方案.
编辑2(午餐后):在这里.

public class TupleAComparator<A extends Comparable<A>,B extends Comparable<B>> implements Comparator<Tuple<A,B>> {

    @Override
    public int compare(Tuple<A,B> t1,Tuple<A,B> t2) {
        return t1.aValue.compareTo(t2.aValue);
    }

}

编辑3:代码补充作为评论#1的答案(增加评论#2)
TupleArrayList.java:

import java.util.ArrayList;
import java.util.List;


public class TupleArrayList<A,B> extends ArrayList<Tuple<A,B>> {

    /**
     * An ArrayList for tuples that can generate a List of tuples' elements from a specific position within each tuple
     */
    private static final long serialVersionUID = -6931669375802967253L;

    public List<A> GetAValues(){
        ArrayList<A> aArr = new ArrayList<A>(this.size());
        for(Tuple<A,B> tuple : this){
            aArr.add(tuple.aValue);
        }
        return aArr;
    }

    public List<B> GetBValues(){
        ArrayList<B> bArr = new ArrayList<B>(this.size());
        for(Tuple<A,B> tuple : this){
            bArr.add(tuple.bValue);
        }
        return bArr;
    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读