【问题标题】:How to sort Array list integer type [duplicate]如何对数组列表整数类型进行排序[重复]
【发布时间】:2016-08-04 09:30:13
【问题描述】:

我有一个如下所示的对象类产品

public class Product {
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    int price;
    String id;
    String image;
}

我想根据价格对产品进行排序。 我的数组是

 List<Product> products=new ArrayList<>();

 for(int i=0;i<ja3.length();i++){
     JSONObject jsonObject=ja3.getJSONObject(i);
     Product product=new Product();
     product.setId(jsonObject.getString("product_id"));
     product.setImage("http://ezybzy.com/images/"+jsonObject.getString("product_id")+"/1.jpg");
     product.setPrice(jsonObject.getInt("product_SP"));
     product.setName(jsonObject.getString("product_name"));
     products.add(product)
 }

我做到了

Collections.sort(products, new Comparator<Product>() {
    @Override
    public int compare(Product lhs, Product rhs) {
        return lhs.getPrice().compareTo(rhs.getPrice());
    }
})

但问题是.compareTo(rhs.getPrice() 部分错误。它不能使用compareTo 方法。我希望我的arrayList 根据产品的价格排序。价格是整数值。但是当我改变我得到了CompareTo 的字符串类型,但由于字符串类型,它仍然未排序。请帮助我

【问题讨论】:

标签: java android sorting android-studio arraylist


【解决方案1】:
Collections.sort(products, new Comparator< Product >() {
    @Override public int compare(Product p1, Product p2) {
        return p1.getPrice()- p2.getPrice(); // Ascending
    }
});

注意这是整数之间的比较,所以不用改成字符串

【讨论】:

  • @Richardo 如果我们尝试这个,你会得到一个像 val1-val2 这样的实际值,它不会返回 0 或 1 或 -1
【解决方案2】:

在您的对象中实现Comparable 接口。然后你可以使用Collections class sort方法如下:

List<Product> products=new ArrayList<>();
Collections.sort(products);

【讨论】:

    【解决方案3】:

    如果您使用int 作为价格,您可以简单地减去价格,而不是使用CompareTo。如果您使用字符串,我会首先将它们解析为双精度(或整数,但双精度对价格更有意义)Double.parseDouble(rhs.getPrice()),然后减去它们。

    【讨论】:

      【解决方案4】:

      这里有三个可以从比较函数返回的值

      • 0
      • 正数,例如 1
      • 负数,例如 -1

      正值表示第一个对象(本例中为 p1)大于第二个对象(本例中为 p2),反之亦然。 0 表示对象相等

      所以对于升序,你可以覆盖比较为

      Collections.sort(products, new Comparator< Product >() {
          @Override public int compare(Product p1, Product p2) {
              return p1.getPrice()- p2.getPrice(); // Ascending
          }
      });
      

      降序

      Collections.sort(products, new Comparator< Product >() {
          @Override public int compare(Product p1, Product p2) {
              return p2.getPrice()- p1.getPrice(); // Descending
          }
      });
      

      【讨论】:

        【解决方案5】:

        您可以像这样在模型类中实现 Comparable -

        public class Product implements Comparable<Product> {
            public String getName() {
                return name;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            String name;
        
            public String getId() {
                return id;
            }
        
            public void setId(String id) {
                this.id = id;
            }
        
            public String getImage() {
                return image;
            }
        
            public void setImage(String image) {
                this.image = image;
            }
        
            public int getPrice() {
                return price;
            }
        
            public void setPrice(int price) {
                this.price = price;
            }
        
            int price;
            String id;
            String image;
        
            @Override
            public int compareTo(Product another) {
                return getPrice() - another.getPrice();
            }
        }
        

        然后,无论您在哪里使用排序,都只能使用排序功能-

        Collections.sort(products);
        

        【讨论】:

        • 如果我想按名称排序我应该怎么做。不删除价格排序功能?
        • 使用 getName 代替 getPrice。您可以根据您的要求更改它。如果它是该对象的字符串,则覆盖 toString() 方法并使用 toString().compareTo(another.toString()) 作为该函数中的返回值。
        • 但是当我实现 Comparable 时,一次只能按一个排序吗?
        • 你一次一个。但是当你正在实施它时,你可以根据你的需要来制作它。就像您可以一次比较它们一样...首先价格然后名称...您可以选择将其编码出来
        • 我想在不同时间按价格和名称排序。我该如何实现?
        【解决方案6】:

        对于 compareTo,你必须使用一个对象,它不能与 int 一起使用,如果你想让它工作,要么将其转换为 Integer,要么只使用 if 条件进行比较。

        【讨论】:

          猜你喜欢
          • 2019-07-01
          • 1970-01-01
          • 2019-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-11
          相关资源
          最近更新 更多