【问题标题】:Printing out list returns weird memory reference打印出列表返回奇怪的内存引用
【发布时间】:2015-11-08 01:40:32
【问题描述】:

所以我正在编写一个对列表进行排序的简单程序。我想在实际开始实现比较器/排序之前对其进行测试,并且在打印出列表的内容时,我在 main 方法上遇到了问题。这是我的测试仪:

    public class Lab6Exercise {
public static void main(String[] args) {
    //creates list of students
    List<Student> studentList = new ArrayList<>();
    //randomizes GPA
    Random rand = new Random();
    int randID = rand.nextInt(10000) + 10000;
    int randInt = rand.nextInt(4);
    double randDec = rand.nextDouble();
    double randGrade = randInt + randDec;

    studentList.add(new Student(randID, "Chester", "Smith", randGrade));
    studentList.add(new Student(randID, "Sally", "Winters", randGrade));
    studentList.add(new Student(randID, "Tim", "Jackson", randGrade));
    studentList.add(new Student(randID, "Winston", "Pulitzer", randGrade));
    studentList.add(new Student(randID, "Jackie", "Harris", randGrade));
    studentList.add(new Student(randID, "Paul", "Newman", randGrade));
    studentList.add(new Student(randID, "Sally", "Ride", randGrade));
    studentList.add(new Student(randID, "John", "Smith", randGrade));
    studentList.add(new Student(randID, "Cassie", "Anderson", randGrade));
    studentList.add(new Student(randID, "Sam", "Bowman", randGrade));
    studentList.add(new Student(randID, "Wade", "Mathers", randGrade));
    studentList.add(new Student(randID, "Jackson", "Pink", randGrade));
    studentList.add(new Student(randID, "Bill", "Throwers", randGrade));
    studentList.add(new Student(randID, "Tupac", "Shakur", randGrade));
    studentList.add(new Student(randID, "Amy", "Allen", randGrade));
    studentList.add(new Student(randID, "Charlie", "Waffles", randGrade));
    studentList.add(new Student(randID, "Cindy", "Decker", randGrade));
    studentList.add(new Student(randID, "Douglas", "Harris", randGrade));
    studentList.add(new Student(randID, "Jimmy", "Duggers", randGrade));
    studentList.add(new Student(randID, "Vince", "Eisel", randGrade));


    System.out.println("STUDENT LIST BEFORE SORTING: \n");

    for (Student stud : studentList){
        System.out.println(stud);
    }
}

}

我的输出看起来像:

STUDENT LIST BEFORE SORTING: 

edu.csu.lab6.Student@677327b6
edu.csu.lab6.Student@14ae5a5
edu.csu.lab6.Student@7f31245a
edu.csu.lab6.Student@6d6f6e28
edu.csu.lab6.Student@135fbaa4
edu.csu.lab6.Student@45ee12a7
edu.csu.lab6.Student@330bedb4
edu.csu.lab6.Student@2503dbd3
edu.csu.lab6.Student@4b67cf4d
edu.csu.lab6.Student@7ea987ac
edu.csu.lab6.Student@12a3a380
edu.csu.lab6.Student@29453f44
edu.csu.lab6.Student@5cad8086
edu.csu.lab6.Student@6e0be858
edu.csu.lab6.Student@61bbe9ba
edu.csu.lab6.Student@610455d6
edu.csu.lab6.Student@511d50c0
edu.csu.lab6.Student@60e53b93
edu.csu.lab6.Student@5e2de80c
edu.csu.lab6.Student@1d44bcfa

Process finished with exit code 0

所以我假设它使用整个包的地址并引用存储学生信息的特定内存地址....我该如何解决这个问题?我想它应该很简单,但是语法的所有细微差别都不是我在 Java 中的强项。正如你所知道的,我在这方面还是比较新的。提前感谢您提供的任何帮助。

【问题讨论】:

    标签: list sorting printing


    【解决方案1】:

    你告诉它打印一个学生对象,而不是一个字符串。所以输出取决于该类实现 ToString() 方法(或继承默认值)。

    您可以随意打印各个属性和格式:

    // You don't show the actual property names in your code so I made them up
    for (Student stud : studentList) {
        System.out.printf("ID: %s, Name: %s %s, Grade: %s",
            stud.ID, stud.First, stud.Last, stud.Grade);
    }
    

    ...或者,您可以覆盖 Student 类的 ToString() 方法,以返回您想要的格式的字符串:How to override toString() properly in Java?

    另外,不确定是否重要,但关于这一行:

    List<Student> studentList = new ArrayList<>();
    

    有什么理由不直接使用它?

    List<Student> studentList = new List<Student>;
    

    ...所以它是强类型的。以前的版本存储为 Object 的 ArrayList 而不是 Student 的 List。

    【讨论】:

    • 不错!将其从 new ArrayList 更改为 new ArrayList 修复了整个问题。我也喜欢你的第一个格式化技巧,但在尝试后,无论出于何种原因,编译器都无法解析 Format 方法。非常感谢你的帮助!
    • 其实我错了。在我提出这个问题后,我正在做一些研究,并在我的学生班上整理了一个 toString 试图看看这是否能解决它。在我写完 toString 之后,我回顾了这个问题并尝试了你的建议,认为这就是解决问题的方法。原来是我写的toString,哈哈。当我认为它是良性代码并再次开始获取内存指针时,我意识到了这一点。非常感谢您抽出宝贵时间提供帮助,再次感谢。
    • 很高兴 ToString() 修复了它。不过,我仍然会保留 ArrayList 。只是好习惯。抱歉,当我编写 String.Format() 时,我的大脑处于 .NET/C# 模式。在 Java 中,它有点不同但概念相同:examples.javacodegeeks.com/core-java/lang/string/… 我将更新这个问题只是为了准确/后代。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多