【问题标题】:Sort an arraylist by array element按数组元素对数组列表进行排序
【发布时间】:2014-04-13 23:12:00
【问题描述】:

所以我将数组添加到我的数组列表中,我希望它按数组的第二个元素排序,这可能吗,这是我编写的代码,但没有返回正确的输出,

[5.0, 0.0, 2.0]
[1.0, 2.0, 0.0]
[2.0, 5.0, 0.0]
[3.0, 3.0, 0.0]
[0.0, 8.0, 2.0]

  public void add(double[] k){

    if(a.size()==0){
        a.add(k);

    }
    else if(k[1]<=a.get(0)[1]){
        a.add(0,k);

    }
    else if(k[1]>a.get(0)[1]) {
        int i =0;
        while(a.get(i)[1]<k[1] && i<a.size()-1){
            i++;
        }
        a.add(i+1,k);
    }
    length++;
}

public  void apr(){

    for(int i=0; i<a.size(); i++)
        System.out.println(Arrays.toString(a.get(i)));
    }   

public static void main(String args[]){
    double k[]= {1,2,0};
    double k1[]= {2,5,0};
    double k2[] = {3,3,0};
    double k3[] = {5,0,2};
    double k4[] = {0,8,2};
    Sample amostra1 = new Sample();
            amostra1.add(k);
    amostra1.add(k1);
    amostra1.add(k2);
    amostra1.add(k3);
    amostra1.add(k4);
    amostra1.apr();

第一行是不正确的输出,我希望数组按它们的第二个组件或第一个组件排序,我猜它只是对代码的一点修改

【问题讨论】:

    标签: java arrays sorting arraylist


    【解决方案1】:

    我会用 ArrayList 的自定义比较器这样做:

    Collections.sort(amostra1, new Comparator<double[]>() {
    
                @Override
                public int compare(double[] o1, double[] o2) {
                    int index = 1; // second element of the array
                    return Double.compare(o1[index], o2[index]);
                }
            });
    

    要根据数组的第一个元素进行排序,只需将 index 设置为 0,即可得到根据第一个元素排序的数组。

    请注意,Collections.sort(...) 需要一个 List 和一个 Comparator

    【讨论】:

    • 不,这不起作用,因为我的 Arraylist 是数组的 Arraylist,它说该方法不适用于参数
    • 您确定用于比较器的参数是数组吗?因为在上面的例子中它们是 (double[])。老实说,我在提交之前尝试了这段代码,它适用于 amostra1 作为 ArrayList 而不是 Sample。 :) 你得到的错误不是因为比较器,而是因为你正在使用的“Sample”类(它不是一个列表)这是方法看到的,确保方法 sort(...) 需要我在答案中提到的 List 输入。
    【解决方案2】:

    我最终为我的 add 函数编写了一个“排序”算法,因为我的示例是一个数组列表,我无法创建一个列表,所以这就是我最终做的事情,成为我的数组列表的“一个”稍后定义为样本。上述算法存在一些问题,因为它没有考虑插入比列表最后一个更小的元素,或者插入到列表的中间。这按第一个组件排序,但是如果您将 a.get(i)[0] 更改为 a.get(i)[1] 它会按第二个组件排序,无论如何感谢您的帮助;)

    public void add(double[] k){
    
              if(a.size()==0 || a.get(0)[0]>k[0]){
                   a.add(0,k);
              }
              else {
                  int i=0;
                  while(a.get(i)[0]<k[0]&& i<a.size()-1){
                      i++;
              }
                 if(i==a.size()-1 && a.get(i)[0]>k[0] ||(i!=a.size()-1 && a.get(i)[0]>k[0]) ){
                     a.add(i,k);
                 }
                 else if(i==a.size()-1 && a.get(i)[0]<k[0] || (i!=a.size()-1 && a.get(i)[0]<k[0])){
                  a.add(i+1,k);
              }
    
                 }
              length++;
                 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 2020-10-19
      • 1970-01-01
      相关资源
      最近更新 更多