【问题标题】:Casting Object[] to custom Item[]将 Object[] 转换为自定义 Item[]
【发布时间】:2013-08-12 23:37:00
【问题描述】:

我有我的数组列表

ArrayList<Item> itemList = new ArrayList<Item>();

然后用项目填充它。 稍后,我想循环访问项目属性以获取数据,但是

Item[] itemArr = (Item[]) itemList.toArray();

这给了我错误:

 java.lang.ClassCastException: java.lang.Object[] cannot be cast to com.raynemartin.SAAndroidAppCompetition.Item[]

如果这注定要失败,我还能如何访问项目的属性? 这些项目位于 ArrayList 中,因此它们可以填充和 android ListView。现在我想对 ArrayList 进行排序,但需要访问我的 Item 类的 .getRating() 方法。

Item[] itemArr= (Item[])itemList.toArray();

    for(int i =0;i<itemArr.length;i++){
            for(int j=i;i<itemArr.length;j++){
                if(itemArr[j].getRating()>itemArr[i].getRating()){
                        Item temp = itemArr[j];
                        itemArr[j] = itemArr[i];
                        itemArr[i] = temp;
                }
            }
        }
    }

编辑 - 这是项目类别代码

public class Item {

    private String title;
    private String category;
    private String downloads;
    private double rating;
    private Bitmap icon;

    public Item(String title, String category, String downloads,double rating,Bitmap icon) {
        this.title = title;
        this.category = category;
        this.downloads = downloads;
        this.icon = icon;
        this.rating = rating;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getDownloads() {
        return downloads;
    }

    public void setDownloads(String downloads) {
        this.downloads = downloads;
    }

    public Bitmap getIcon() {
        return icon;
    }

    public void setIcon(Bitmap icon) {
        this.icon = icon;
    }

    public double getRating() {
        return rating;
    }

    public void setRating(double rating) {
        this.rating = rating;
    }
}

【问题讨论】:

  • 显示您的 Item 类代码。mkyong.com/java/…。检查这个
  • 与您的问题无关,但无论如何都值得更改:将 ArrayList 更改为 List
  • 试试 Item[] itemArr = itemList.toArray(new Item[itemList.size()]);
  • @Captain-RayneMartin 试试我的答案,让我知道它是否有效

标签: android listview casting arraylist


【解决方案1】:

要排序,您可以尝试以下操作。

在你的 Item 类中实现 toString

public String toString()
{
    return String.valueOf(rating);
}

实现一个比较器

 class SortingRating implements Comparator<Item>
{

        @Override
        public int compare(Item arg0, Item arg1) {
            if (arg0.getRating() < arg1.getRating()) return -1;
            if (arg0.getRating() > arg1.getRating()) return 1;
            return 0;
    }

}

然后对你的列表进行排序

   Collections.sort(itemList, new SortingRating());

示例:如果我错了,请纠正我。

public class MainClass {
    static ArrayList<Item> aa = new ArrayList<Item>();
    public static void main(String[] args) {

        Item i1 = new Item("soap","sales","yes",4.0);
        aa.add(i1);
        Item i2 = new Item("soap","sales","yes",5.2);
        aa.add(i2);
        Item i3 = new Item("soap","sales","yes",3.8);
        aa.add(i3);
        Item i4 = new Item("soap","sales","yes",5.1);
        aa.add(i4);

         Collections.sort(aa, new SortingRating());
         for(int i=0;i<aa.size();i++)
         {
         System.out.println("Title  : " +aa.get(i).getTitle()+"--"+"Category : "+aa.get(i).getCategory()+"--"+"Downlaods : "+aa.get(i).getDownloads()+"--"+"Rating : "+aa.get(i).getRating());
         }

    }
}
class SortingRating implements Comparator<Item>
{

        @Override
        public int compare(Item arg0, Item arg1) {
            if (arg0.getRating() < arg1.getRating()) return -1;
            if (arg0.getRating() > arg1.getRating()) return 1;
            return 0;
        }   
}

物品类。遗漏了位图图标

public class Item  {

    private String title;
    private String category;
    private String downloads;
    private double rating;


    public Item(String title, String category, String downloads,double rating) {
        this.title = title;
        this.category = category;
        this.downloads = downloads;
        this.rating = rating;
    }
    public String toString()
    {
        return String.valueOf(rating);
    }
    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getDownloads() {
        return downloads;
    }

    public void setDownloads(String downloads) {
        this.downloads = downloads;
    }

    public double getRating() {
        return rating;
    }

    public void setRating(double rating) {
        this.rating = rating;
    }
}

输出

Title  : soap--Category : sales--Downlaods : yes--Rating : 3.8
Title  : soap--Category : sales--Downlaods : yes--Rating : 4.0
Title  : soap--Category : sales--Downlaods : yes--Rating : 5.1
Title  : soap--Category : sales--Downlaods : yes--Rating : 5.2

【讨论】:

    【解决方案2】:

    让类Item实现接口Comparable并使用

    Collections.sort(itemList);
    

    对您的收藏进行排序。这样就不用自己构造数组和排序了。

    【讨论】:

      【解决方案3】:

      如果你真的需要以数组的形式访问元素,你最好使用

      itemList.toArray(new Item[0]);
      

      itemList.toArray(new Item[itemList.size()]);
      

      因为这会给你一个 Item 类型的数组而不是一个对象数组。在网上其他地方有很多关于这个问题的讨论。

      【讨论】:

      • 谢谢,这是一个易于使用的解决方案
      猜你喜欢
      • 2014-01-09
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多