如何在java中将类的所有对象中的值相加?

时间:2016-10-13 05:42:06

标签: java object foreach accumulate

我正在尝试从同一个类下的多个对象中检索某些值。我已经使用a for each循环来遍历每个对象,并且想要创建一个聚合总计,表示对象中项目的评级和成本。

我父类中的For Each循环:

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;
}

Child类ArrayList用于存储对象:

<td data-title="'id'" sortable="'id'" filter="{ 'id': 'text' }">
    {{variant.id}}
</td>

当我编译代码时,我收到一条错误消息,指出对象无法转换为歌曲。有没有办法解决这个问题,或者更简单的方法来完成相同的任务?

3 个答案:

答案 0 :(得分:1)

如果您曾阅读docs,则会知道ArrayList实际上是通用类。这意味着您可以为ArrayList提供类型。

数组列表可以存储的内容类型取决于您给出的类型。但如果你不给它任何类型,它会存储Object s!在这里,

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

你想从Song个对象的数组列表中获取Object个对象,这对编译器没有意义。结果,出现错误。

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

更改此

private static ArrayList songArray = new ArrayList();

到此:

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

并改变这一点:

public static ArrayList returnSongs() {

到此:

public static ArrayList<Song> returnSongs() {

答案 1 :(得分:0)

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

private static ArrayList songArray = new ArrayList();

到此:

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

然后ArrayList类将理解您正在使用Song的实例。

Jim Garrison指出

编辑,还应更改returnSongs()方法,以同样的方式指定类类型。

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

答案 2 :(得分: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; }
}