简体   繁体   English

Java中的HashSet

[英]HashSet in java

I study programming java, and i have problem about java.util.HashSet my question, How to show size() in hashset this my code 我学习编程Java,并且对java.util.HashSet有问题,我的问题是如何在哈希集中显示size()这是我的代码

// class Student

package name;
public class Student
{
   private String name;
   public String getName()
   {
      return this.name;
   }
   public void setName(String name)
   {
     this.name = name;
   }
}
// Entry Point
package client;
import name.Student;
import java.util.Set;
import java.util.HashSet;
import java.util.Scanner;
public class Client1
{
    public static void main (String[] args)
    {
       Scanner scan = new Scanner(System.in);
       Set<Student> students = new HashSet<Student>();
       Student student = new Student();

       int totalStudent = 0;
       System.out.print("TypeTotal Student : ");
       totalStudent = Integer.parseInt(scan.nextLine());

       for(int i = 0; i < totalStudent ; i++)
       {
           System.out.print("Name : ");
           String name = scan.nextLine();
           student.setName(name);
           students.add(student);
       }
       System.out.println("Element Total In Set :" students.size());
       for(Student std: students)
       {
           System.out.println(std.getName());
       }
    }
}

if i run this code in terminal student.size() not increase. 如果我在终端student.size()中运行此代码,则不会增加。 i need advice 我需要建议

That's because you're adding the same student everytime in hashset. 那是因为您每次都在哈希集中添加相同的学生。 And HashSet doesn't allow duplicate values. 而且HashSet不允许重复值。

Try this way. 尝试这种方式。

// class Student //班级学生

package name;
public class Student
{
   private String name;
   public String getName()
   {
      return this.name;
   }
   public void setName(String name)
   {
     this.name = name;
   }
}
// Entry Point
package client;
import name.Student;
import java.util.Set;
import java.util.HashSet;
import java.util.Scanner;
public class Client1
{
    public static void main (String[] args)
    {
       Scanner scan = new Scanner(System.in);
       Set<Student> students = null;
       students = new HashSet<Student>();
       Student student;

       int totalStudent = 0;
       System.out.print("TypeTotal Student : ");
       totalStudent = Integer.parseInt(scan.nextLine());

       for(int i = 0; i < totalStudent ; i++)
       {
           System.out.print("Name : ");
           String name = scan.nextLine();
           student = new Student();
           student.setName(name);
           students.add(student);
       }
       System.out.println("Element Total In Set :" students.size());
       for(Student std: students)
       {
           System.out.println(std.getName());
       }
    }
}

If you use this block: 如果使用此块:

{
     System.out.print("Name : ");
     String name = scan.nextLine();
     student.setName(name);
     students.add(student);
}

you are using always same object and Hashset does not allow duplicate (even if you change one property of the object). 您始终使用相同的对象,并且Hashset不允许重复(即使您更改了对象的一个​​属性)。

Using this block it works fine, because you are creating a new object every interaction: 使用此块可以很好地工作,因为每次交互时都在创建一个新对象:

{
    System.out.print("Name : ");
    String name = scan.nextLine();
    student = new Student();
    student.setName(name);
    students.add(student);
}

even if the variable is the same (student) you create a new instance with new 即使变量是相同的(学生)创建新的一个新实例

In your code, Student student is a reference to exactly one object (ever). 在您的代码中, Student student是对一个对象(永远)的引用。 Since you do not allocate a new Student each time you add an object to the students set, you are, instead, adding the same object to the Set multiple times. 由于您不会在每次将一个对象添加到students集中时都分配新的Student ,因此,您要多次将同一对象添加到该Set

Note that I used the words "same object" and "Set". 请注意,我使用了“相同对象”和“设置”这两个词。 A Set allows no more than one instance of an object. Set最多允许一个对象的实例。

Your code is pretending to add multiple students, but is actually only adding one student. 您的代码假装要添加多个学生,但实际上只添加了一个学生。

The solution is as follows: 解决方法如下:

 // really add a student to the set.
 System.out.print("Name : ");
 String name = scan.nextLine();
 student = new Student();// note this line.
 student.setName(name);
 students.add(student);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM