2016-10-13 41 views
0

我想从同一个类下的多个对象检索某些值。我已经使用每个循环遍历每个对象,并且希望创建一个汇总总计,表示该对象中项目的评分和成本。如何将java类中所有对象的值加在一起?

的对于我的父类中的每个循环:

for (Song songObj : Song.returnSongs()) { 
    totalSongCost += Double.parseDouble(songObj.getPrice()); 
    totalSongRating += Integer.parseInt(songObj.getRating()); 
} 

子类的ArrayList旨在存储对象:

private int rating; 
private String title; 
private double price; 
private boolean favorite; 
private static int counter = 0; 
private static ArrayList songArray = new ArrayList(); 

/** 
* Constructor for objects of class Song 
*/ 
public Song() 
{ 
    // initialise instance variables 
    rating = 0; 
    title = ""; 
    price = 0.0; 
    counter++; 
    songArray.add(this); 
} 
public static ArrayList returnSongs() { 
    return songArray; 
} 

当我编译我得到一个错误信息的代码说的对象不能转换成歌曲。有没有办法解决这个问题,或者一个更简单的方法来完成相同的任务?

+0

你可能应该有另一个类,比如“Album”,它拥有歌曲的数组列表,因为你当前的实现将不起作用。您不能将包含列表的对象(即歌曲)添加到列表中(在歌曲中)。 –

+0

@BenjaminLowry对象不包含列表,因为它是'static',因此不属于任何对象。 – ajb

+0

@ajb啊,是的,我的坏,没有看到它是静态的。 –

回答

1

如果你读过的docs,你就会知道,ArrayList实际上是一个通用类。这意味着你可以给ArrayList一个类型。

数组列表可以存储的东西的类型取决于你给它的类型。但是如果你不给它任何类型的话,它会存储Object!在这里,

for (Song songObj : Song.returnSongs()) { 

要从Object对象的数组列表,这是没有意义的编译器得到Song对象。结果,出现错误。

这个问题的解决方案当然是给数组列表一个类型,以便它知道它应该存储什么类型。

更改此

private static ArrayList songArray = new ArrayList(); 

这样:

private static ArrayList<Song> songArray = new ArrayList<>(); 

并改变这一点:

public static ArrayList returnSongs() { 

这样:

public static ArrayList<Song> returnSongs() { 
+0

由于某种原因,当我这样做时,我只能访问最近的对象,而不是该类的所有对象,为什么? – Caleb

+0

请确保'songArray'声明为'static'。 @ user6828298 – Sweeper

0

ArrayList是一个泛型类。这意味着您可以指定要使用的类类型。如果你改变这一点:

private static ArrayList songArray = new ArrayList(); 

这样:

private static ArrayList<Song> songArray = new ArrayList<Song>(); 

然后ArrayList类会明白,你与宋的情况下工作。

编辑:正如Jim Garrison所指出的那样,您的returnSongs()方法也应该改为以相同的方式指定类的类型。

public static ArrayList<Song> returnSongs() { ... 
+1

不要忘记在'returnSongs()'被调用的地方将'public static ArrayList returnSongs()'改成'public static ArrayList returnSongs()'和泛型类型。 –

0

Song课负责跟踪应用程序中的所有歌曲是有点不寻常的。这似乎不在该类的职责范围之内,并且可能更适合在不同类中处理,无论是在您的父类中还是在特定的新类型中处理。

此外,使用类型如ListArrayList时要小心。由于您的编译器会提醒您,这些需要尖括号中的类型参数(即List<Type>)。你应该使它成为解决所有编译器警告的习惯,并且总是为通用类型指定类型参数,如List。如果你没有正确定义你的类型,事情开始默认为Object,这会导致你在这里遇到的问题。

下面是什么,这可能看起来像一个例子,重组,以保持Song类专为歌曲本身的属性:

import java.util.ArrayList; 
import java.util.List; 

public class Parent { 
    private static List<Song> songs = new ArrayList<Song>(); 
    private static double totalSongCost = 0.0; 
    private static int totalSongRating = 0; 

    public static void main(String[] args) { 
     populateSongs(); 

     for (Song song : songs) { 
      totalSongCost += songObj.getPrice(); 
      totalSongRating += songObj.getRating(); 
     } 
    } 

    private void populateSongs() { 
     songs.add(new Song(5, "Hey Jude", 12.5)); 
     songs.add(new Song(4, "Angie", 11.5)); 
     songs.add(new Song(0, "Other", 10.5)); 
    } 
} 

你的歌曲类,简直是这样的:

public class Song { 
    private int rating = 0; 
    private String title = ""; 
    private double price = 0.0; 

    public Song(int rating, String title, double price) { 
     this.rating = rating; 
     this.title = title; 
     this.price = price; 
    } 

    // Compressed for brevity 
    public int getRating() { return rating; } 
    public String getTitle() { return title; } 
    public double getPrice() { return price; } 
} 
相关问题