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; } 然后,只需相应地调整比较器,你就有了一个通用的解决方案. 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) 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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |