为什么我的arraylist的Java Set方法不起作用? 公共班级学生实施可比 { 私有字符串名称; 私人双积分=0; 私人整数单位=0; 私有整数指数=-1; 公立学生(字符串名称) { this.name=名称; } public int getIndex(){ 收益指数; } 公共无效集合索引(int i){ 指数=i; } 公立学生(字符串名称、双gpa、整数单位) { this.name=名称; 这个。单位=单位; this.gradePoints=gpa*单位; } 公共字符串getName() { 返回名称; } 公共双gpa() { 如果(单位>0) 返回积分/单位; 返回0; } 公共void addGrade(双gradePointsPerUnit,整数单位) { 这是1.1个单位+=个单位; this.gradePoints+=gradePointsPerUnit*单位; } public int compareTo(Student other)//不要更改此方法。如果愿意,请问我为什么。 { 双差=gpa()-other.gpa(); 如果(差=0)返回0; 如果(差异>0)返回14;//不要在代码中硬编码14或-12。 返回-12; } } import java.util.ArrayList; 公营希邦{ 公共静态void main(字符串[]args){ ArrayList x=新的ArrayList(); 学生a=新生(“鲍勃”,1,2); 学生b=新生(“arav”,3,4); x、 添加(a); x、 添加(b); x、 set(0,b);//应将arraylist中的第一个元素更改为名为“arav”的学生 } }

为什么我的arraylist的Java Set方法不起作用? 公共班级学生实施可比 { 私有字符串名称; 私人双积分=0; 私人整数单位=0; 私有整数指数=-1; 公立学生(字符串名称) { this.name=名称; } public int getIndex(){ 收益指数; } 公共无效集合索引(int i){ 指数=i; } 公立学生(字符串名称、双gpa、整数单位) { this.name=名称; 这个。单位=单位; this.gradePoints=gpa*单位; } 公共字符串getName() { 返回名称; } 公共双gpa() { 如果(单位>0) 返回积分/单位; 返回0; } 公共void addGrade(双gradePointsPerUnit,整数单位) { 这是1.1个单位+=个单位; this.gradePoints+=gradePointsPerUnit*单位; } public int compareTo(Student other)//不要更改此方法。如果愿意,请问我为什么。 { 双差=gpa()-other.gpa(); 如果(差=0)返回0; 如果(差异>0)返回14;//不要在代码中硬编码14或-12。 返回-12; } } import java.util.ArrayList; 公营希邦{ 公共静态void main(字符串[]args){ ArrayList x=新的ArrayList(); 学生a=新生(“鲍勃”,1,2); 学生b=新生(“arav”,3,4); x、 添加(a); x、 添加(b); x、 set(0,b);//应将arraylist中的第一个元素更改为名为“arav”的学生 } },java,arraylist,Java,Arraylist,在我的代码末尾,第一个元素不是change,而是命名为arav。为什么?我认为在set方法之后,arraylist中的两个元素都将被命名为“arav”。我到处寻找堆栈溢出,但找不到解决方案 以下是运行代码后的调试器: 调试器输出有异味-它说列表中有两次相同的Student对象(id=48)(如您所料),但内容不同。也许调试器没有完全刷新它的显示 如果你在列表内容中循环打印学生姓名会发生什么情况?我创建了一个更简单的代码版本,省去了分心的事情 我构建了一个包含两个Student对象的ArrayLi

在我的代码末尾,第一个元素不是change,而是命名为arav。为什么?我认为在set方法之后,arraylist中的两个元素都将被命名为“arav”。我到处寻找堆栈溢出,但找不到解决方案

以下是运行代码后的调试器:

调试器输出有异味-它说列表中有两次相同的Student对象(id=48)(如您所料),但内容不同。也许调试器没有完全刷新它的显示


如果你在列表内容中循环打印学生姓名会发生什么情况?

我创建了一个更简单的代码版本,省去了分心的事情

我构建了一个包含两个
Student
对象的
ArrayList
,一个用于“Bob”,一个用于“Alice”。我将“Bob”对象替换为“Alice”。我的列表中留下了对同一个“Alice”对象的两个引用

对我有用。这似乎是正确的:您的调试器要么有错误,要么需要刷新

package work.basil.example.listing;
导入java.util.ArrayList;
导入java.util.List;
公立班学生
{
//成员字段
私有字符串名称;
私人双积分=0;
私人整数单位=0;
//建设者
公立学生(字符串名称)
{
this.name=名称;
}
公立学生(字符串名称、双gpa、整数单位)
{
this.name=名称;
这个。单位=单位;
this.gradePoints=gpa*单位;
}
//对象覆盖
@凌驾
公共字符串toString()
{
返回“学生{”+
“name=”+name+“\”+
“|成绩积分=”+成绩积分+
“|单位=”+单位+
" }";
}
//`main`运行应用程序
公共静态void main(字符串[]args)
{
Liststudents=newarraylist();
学生鲍勃=新学生(“鲍勃”,1,2);
学生alice=新学生(“alice”,3,4);
学生。添加(bob);
学生。加上(爱丽丝);
System.out.println(“students=“+students”);
学生。集合(0,alice);
System.out.println(“students=“+students”);
}
}
跑步的时候

students=[Student{name='Bob'| gradePoints=2.0 | units=2},Student{name='Alice'| gradePoints=12.0 | units=4}]
学生=[学生{name='Alice'|成绩点=12.0 |单位=4},学生{name='Alice'|成绩点=12.0 |单位=4}]

无法复制,适合我。打印列表时显示
[arav,arav]
。投票结束。请参阅(我添加了一个
toString
方法来显示结果),我强烈怀疑您可能在调试器中遇到了错误。输入一个
System.out.println(“完成”)
x.set(0,b)
并在那里设置断点。我打赌你在调试器中得到了正确的数据。如果您能在您的示例中识别调试器停止的行,这将有所帮助。如果从
set()
方法返回时被困,主线程可能会在该点结束,因此谁知道调试器看到了什么。是的,我认为这是一个错误。代码肯定有效,我刚刚尝试过。OP一定是调试器用错了什么的。是的,你是对的,不知什么原因,我的调试器出现了故障!你们在月食上有过这样的经历吗?
public class Student implements Comparable<Student>
{
   private String name;
   private double gradePoints = 0;
   private int units = 0;
   private int index=-1;
   public Student(String name)
   {
      this.name = name;
   }
   public int getIndex() {
       return index;
   }
   public void setIndex(int i) {
       index=i;
   }
   public Student(String name, double gpa, int units)
   {
      this.name = name;
      this.units = units;
      this.gradePoints = gpa * units;

   }
   
   public String getName()
   {
      return name;
   }
   
   public double gpa()
   {
      if(units > 0) 
          return gradePoints/units;
      return 0;
   }
   
   public void addGrade(double gradePointsPerUnit, int units)
   {
      this.units += units;
      this.gradePoints += gradePointsPerUnit * units;
   }
   
   
   public int compareTo(Student other)  //Do not change this method.  Ask me why if you like.
   {
      double difference = gpa() - other.gpa();
      if(difference == 0) return 0;
      if(difference > 0) return 14;     //Do not hardcode 14, or -12, into your code.
      return -12;
   }
}

import java.util.ArrayList;

public class heapgang {
    public static void main(String[] args) {
        ArrayList<Student> x= new ArrayList<Student>();
        Student a= new Student("bob",1,2);
        Student b= new Student("arav",3,4);
        x.add(a);
        x.add(b);
        x.set(0, b); // should change the first element in the arraylist to student named "arav"
        
    }
}