当前位置: 首页 > 面试题库 >

我可以对两个列表进行排序吗?

昌博易
2023-03-14
问题内容

我使用html" target="_blank">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,4,3,2,1

我发现了这个问题:是否存在与Python的zip()等效的Java?但是我宁愿(如果可能并且出于胆怯)使用我已经拥有的库(Java Commons,apache
commons等)来执行此操作。如果没有其他办法,我会给您functional 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", "Dog2", "Horse3", "Cow4", "Spider5"};
    public static int[] data = new int[] {1,2,3,4,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字段排序,然后按String字段排序):

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

[(4,Cow4),(2,Dog2),(3,Horse3),(1,Monkey1),(5,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;
    }

}


 类似资料:
  • 问题内容: 我有一个从排序的csv创建的以下列表 我实际上想按两个条件对列表进行排序:首先按字段1中的值,然后按字段2中的值。我该怎么做? 问题答案: 像这样:

  • 问题内容: 我在Python中有两个列表 我想对第一个列表进行排序,并使用结果对第二个列表进行排序。 换句话说,结果应为: 我知道如何分别对每个列表进行排序,但是如何使用对另一个列表进行排序所产生的索引排列来对一个列表进行排列呢? 问题答案: 施瓦兹变换

  • 问题内容: 我不是数据库专家,所以我需要一些有关正在处理的查询的帮助。在我的照片社区项目中,我不仅要显示标签名称和计数器(标签中的图像数量),而且还想显示标签中最受欢迎的图像(最因果),以丰富标签的可视化效果。 表设置如下: 图像表包含基本图像元数据,重要的是因果字段 Imagefile表每个图像包含多个条目,每种格式一个 标签表保存标签定义 Tag_map表将标签映射到图像 在我通常的试验和错误

  • 问题内容: 我有一个列表列表(由于必须动态生成它,所以不能是元组),它的结构为一个int和一个float的列表列表,像这样: 我想对它进行排序,但我只能设法获得内置的排序功能,以便按列表的第一个元素对其进行排序,或者什么也不做,但是我需要按列表的第二个元素对它们进行排序,但是我没有不想实现我自己的排序功能。所以我想要的一个例子是: 有人可以告诉我如何获取内置的排序功能之一来执行此操作吗? 问题答案

  • 有了上面的地图值列表,我需要在一个伸展过程中根据date1和date2进行排序,从而得到下面的输出… 对于上述输入数据,我要求的O/P顺序是: