2011-12-02 72 views
0

我想从一个已经传入一个集合的对象输出一个字符串。下面这行是我的问题所在。它输出[alex,jane]但格式正确,我相信它应该在alex jane输出。即没有逗号分隔值和数组中的括号。尝试从一个对象传入一个集合输出一个字符串

System.out.print(module.getStudents() + " "); 

我已经尝试了各种解决方案,包括:

System.out.prinf(%s, module.getStudents() + " "); 

System.out.prinln(module.getStudents().[whatever Netbeans makes available] + " "); 

为了帮助你更好地理解这个问题。到目前为止,该应用程序的想法是让用户搜索一个mosule并返回所有连接到它的学生。完整的源代码栏上的驱动程序是:

import java.util.*; 

public class Control { 

public void run() { 

    Student jane = new Student("jane"); 
    Student alex = new Student("alex"); 

    Set<Student> students = new HashSet<Student>(); 
    students.add(jane); 
    students.add(alex); 

    Module ufce1 = new Module("UFCE1"); 
    Module ufce2 = new Module("UFCE2"); 

    Set<Module> modules = new HashSet<Module>(); 
    modules.add(ufce1); 
    modules.add(ufce2); 

    jane.addModule(ufce1); 
    jane.addModule(ufce2); 
    alex.addModule(ufce2); 

    ufce1.addStudent(jane); 
    ufce2.addStudent(jane); 
    ufce2.addStudent(alex); 

    System.out.println("Search module code: "); 

    Scanner scan = new Scanner(System.in);   

    scan = new Scanner(System.in); 
    String searchModule = scan.nextLine().trim(); 

    for (Module module : modules) { 
     if (searchModule.equalsIgnoreCase(module.getName())) { 

      Iterator it = students.iterator(); 
      Student student = (Student) it.next(); 
      if (student.getModules().contains(module)) { 
       System.out.print(student + " "); 
      } 
     } 
    } 


} 
} 

模块类:

import java.util.HashSet; 
import java.util.Set; 

public class Module { 
private String name; 
private Set<Student> students = new HashSet<Student>(); 

public Module(String name) { 
    this.name = name; 
} 

public String getName() { 
    return name; 
} 

public void addStudent(Student student){ 
     students.add(student); 
} 

public Set<Student> getStudents() { 
    return students; 
} 

@Override 
public String toString() { 
    return name; 
} 

} 

学生类别:

import java.util.HashSet; 
import java.util.Set; 

public class Student { 
private String name; 
    private Set<Module> modules = new HashSet<Module>(); 


public Student(String name) { 
    this.name = name; 

} 

public String getName() { 
    return name; 
} 

public void addModule(Module module){ 
     modules.add(module); 
} 

public Set<Module> getModules() { 
    return modules; 
} 

@Override 
public String toString() { 
    return name; 
} 

} 

回答

2

当你做到这一点System.out.print(module.getStudents() + " ");你隐式调用上的toString方法HashSet实例。因此,为了得到你想要的格式,你有2种选择:

  1. 遍历集合并打印你想要
  2. 子类HashSet的方式和覆盖的toString显示你想要的方式。
+0

我已经添加了一个迭代器的代码。这就是你的建议。这将打印出所有学生,无论他们是否在该模块上 – newToJava

+0

是的,因为您没有进行任何过滤。你需要做的是:'学生student = it.next(); if(student.getModules()。contains(module)){System.out.print(student +“”);}' – Chris

+0

@ Chris谢谢。但是当我之前添加这个:Iterator it = students.iterator();它说不兼容的类型? – newToJava

0

问题是getStudents返回Set对象(HashSet,具体而言)。 HashSet,反过来,继承AbstractCollection一个toString()方法,其行为如下:

返回此集合的字符串表示。字符串表示由集合元素的列表组成,它们按其迭代器返回的顺序包含在方括号中(“[]”)。相邻元素由字符“,”(逗号和空格)分隔。通过String.valueOf(Object)将元素转换为字符串。

您需要编写自己的方法将一组学生转换为您想要的格式,否则您可以将默认的toString实现所返回的值提取出来。

0

括号和逗号来自Set上的toString()调用。如果你查看这个方法的源代码,你会看到它添加了这些。您可以覆盖模块类中Set的toString()方法,或者不直接打印Set,而是手动循环遍历所有元素并逐个打印它们

0

@Chris为解决您的问题提供了一个出色的解决方案。然而,有另外一个,我看到越来越容易实现,它是:

public String formatOutputString(){ 
    String setStrings = module.getStudents(); 
    // Get rid of opening bracket 
    String formatedString = setStrings.replace("[", ""); 
    // Get rid of closing bracket 
    formatedString = setStrings.replace("]", ""); 
    // Replace commas by spaces 
    formatedString = setStrings.replace(",", " "); 
    return formatedString; 
} 
相关问题