需要来自 txt 文件的数据,以逗号分隔,以使用现有类中的对象填充数组列表

Posted

技术标签:

【中文标题】需要来自 txt 文件的数据,以逗号分隔,以使用现有类中的对象填充数组列表【英文标题】:Need data from txt file, comma delimited, to populate an arraylist with objects from existing class 【发布时间】:2014-03-17 15:22:06 【问题描述】:

我需要:

从文本文件中获取输入并逐行读取, 获取每一行并将其拆分为学生对象并将这些值发送到数组列表, 将来自 Student 类的对象数组列表发送到我的 servlet, 将数组列表从 servlet 发送到我的 jsp 页面 在 html 表格中显示值。

这是我针对此特定功能的页面。我在这个项目中有许多不同的 java 页面、servlet 和 jsp 页面,所以如果您需要这些页面中的任何内容,请直接询问。

文本文件包含Student信息,顺序如下:

学生 ID、姓氏、名字、测验分数 1-5、化妆测验分数、 期中成绩、问题成绩和期末考试成绩。

文本文件格式示例如下:

1234,Some,Person,98.0,94.0,97.0,96.0,99.0,0.0,92.0,95.0,99.0 1235,另一个,人,89.0,99.0,87.0,85.0,88.0,0.0,89.0,98.0,99.0 1236,Onemore,Person,89.0,98.0,89.0,98.0,97.0,0.0,79.0,89.0,99.0

我在表格中得到的输出只是第一行,全部在第一个单元格中。

如果你能指出我正确的方向,我完全迷失了。

这是我的Student课堂页面:

public class Student 
private String sid,fnm,lnm,lgrade;
private double q1,q2,q3,q4,q5,qmkup,midt,probs,finex,qavg,cavg;

public Student ()
    //empty constructor
    sid="";
    lnm="";
    fnm="";
    lgrade="";
    q1= 0;
    q2= 0;
    q3= 0;
    q4= 0;
    q5= 0;
    qmkup= 0;
    midt= 0;
    probs= 0;
    finex= 0;
    qavg= 0;
    cavg= 0;




public String getSid() 
    return sid;


public void setSid(String sid) 
    this.sid = sid;


public String getFnm() 
    return fnm;


public void setFnm(String fnm) 
    this.fnm = fnm;


public String getLnm() 
    return lnm;


public void setLnm(String lnm) 
    this.lnm = lnm;


public String getLgrade() 
    return lgrade;


public double getQ1() 
    return q1;


public void setQ1(double q1) 
    this.q1 = q1;


public double getQ2() 
    return q2;


public void setQ2(double q2) 
    this.q2 = q2;


public double getQ3() 
    return q3;


public void setQ3(double q3) 
    this.q3 = q3;


public double getQ4() 
    return q4;


public void setQ4(double q4) 
    this.q4 = q4;


public double getQ5() 
    return q5;


public void setQ5(double q5) 
    this.q5 = q5;


public double getQmkup() 
    return qmkup;


public void setQmkup(double qmkup) 
    this.qmkup = qmkup;


public double getMidt() 
    return midt;


public void setMidt(double midt) 
    this.midt = midt;


public double getProbs() 
    return probs;


public void setProbs(double probs) 
    this.probs = probs;


public double getFinex() 
    return finex;


public void setFinex(double finex) 
    this.finex = finex;


public double getQavg() 
    calcStudent();
    return qavg;


public double getCavg() 
    return cavg;


private void calcStudent()
    double[] qs =  q1, q2, q3, q4, q5, qmkup;
    Arrays.sort(qs);
    qavg = (qs[2] + qs[3] + qs [4] + qs[5]) / 4.0;

    if (qavg >= 89.5 && midt >= 89.5 && probs >= 89.5)
        cavg = (qavg+midt+probs) / 3.0;
        lgrade = "A";
    else
        cavg = (qavg * .5) + (midt * .15) + (probs * .1) + (finex * .25);
        if (cavg >= 89.5)
            lgrade = "A";
        else if (cavg >= 79.5)
            lgrade = "B";
        else if (cavg >= 69.5)
            lgrade = "C";
        else if (cavg >= 59.5)
            lgrade = "D";
        else
            lgrade = "F";
        
    


@Override
public String toString()
    String s = sid + "," + lnm + "," + fnm + "," + 
            q1 + "," + q2 + "," + q3 + "," + q4 + "," + q5 + "," + 
            qmkup + "," + midt + "," + probs + "," + finex;

    return s;

这是我的 java 页面:

public class StudentIO 
public static void addStudent(Student s, String path)
             throws IOException
    File f = new File(path);
    PrintWriter out = new PrintWriter(new FileWriter(f,true));
    out.println(s.toString());
    out.close();


public static ArrayList<Student> getStudentList(String path)
              throws IOException 

    BufferedReader in = new BufferedReader
            (new FileReader(path));

    ArrayList<Student> sList = new ArrayList<Student>();
    String line = in.readLine();
    String data[];


    while (line != null)
        data = line.split(",");
        Student s = new Student();

        s.setSid(data[0]);
        s.setLnm(data[1]);
        s.setFnm(data[2]);
        s.setQ1(Double.parseDouble(data[3]));
        s.setQ2(Double.parseDouble(data[4]));
        s.setQ3(Double.parseDouble(data[5]));
        s.setQ4(Double.parseDouble(data[6]));
        s.setQ5(Double.parseDouble(data[7]));
        s.setQmkup(Double.parseDouble(data[8]));
        s.setMidt(Double.parseDouble(data[9]));
        s.setProbs(Double.parseDouble(data[10]));
        s.setFinex(Double.parseDouble(data[11]));

        s.getSid();
        s.getLnm();
        s.getFnm();
        s.getQ1();
        s.getQ2();
        s.getQ3();
        s.getQ4();
        s.getQ5();
        s.getQmkup();
        s.getMidt();
        s.getProbs();
        s.getFinex();

        sList.addAll(Arrays.asList(s));

        line = in.readLine();
        
    in.close(); 
    return sList;


这是我的 servlet:

public class ClassListServlet extends HttpServlet 

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException 
    response.setContentType("text/html;charset=UTF-8");
    String emsg = "";
    String path;
    String URL = "/ClassList.jsp";

    ArrayList<Student> stulist;

    try
        path = getServletContext().getRealPath("/WEB-INF/classlist.txt");
        stulist = StudentIO.getStudentList(path);
        request.setAttribute("stulist", stulist);
    catch (Exception e)
        emsg = "Process error: " +e.getMessage();
        URL = "/students.jsp";
    
    RequestDispatcher disp = getServletContext().getRequestDispatcher(URL);
    disp.forward(request, response);

这里是 JSP 页面:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Class List</title>
</head>
<body>

    <h1>Students on file:</h1>
    <table>
        <tr>    
            <th colspan="12"><br>Class List</th>
        </tr>
        <tr>
            <th colspan="1">Student ID</th>
            <th colspan="1">Last Name</th>
            <th colspan="1">First Name</th>
            <th colspan="1">Quiz 1</th>
            <th colspan="1">Quiz 2</th>
            <th colspan="1">Quiz 3</th>
            <th colspan="1">Quiz 4</th>
            <th colspan="1">Quiz 5</th>
            <th colspan="1">Make-Up Quiz</th>
            <th colspan="1">Midterm</th>
            <th colspan="1">Problems</th>
            <th colspan="1">Final</th>
        </tr>
            <%

                ArrayList<Student> studt = (ArrayList<Student>) 
                                        request.getAttribute("stulist");

                for (int i = 0; i < studt.size(); i++) 
            %>
        <tr>
            <td><%= studt.get(i) %></td>
        </tr>


            <%  %>
    </table>
    <% 
       //cells and titles for each output field     
       //every time through loop will process each individual
       //student object instead of string objects
    %>
</body>

【问题讨论】:

好的,所以多余的实例消失了。我仍然只在每一行上输出每个学生对象数组的整个字符串。我不知道如何用每个单元格中的单个对象填充表格 而且输出仍然包含逗号分隔符。 【参考方案1】:

当您在 StudentIO.java 中填充 sList 时,sList 是否包含文件中的所有行?尝试将 while 循环更改为:

while ( ( line = in.readLine( ) ) != null ) 

此外,您正在将 Student 对象转换为字符串,然后将其发送到您的 JSP。请传递完整的 List 对象,然后打印它。另外,您需要 colspan 属性:

<tr>
    <td><%= studt.get(i) %></td>
</tr>

【讨论】:

是的,它返回文件的所有行,但不是将它们放在每个单元格中,而是将其作为字符串返回,就像从文本文件中读取的那样。我不确定我是否了解如何从 java 页面中跨 servlet 和 jsp 页面保留我的对象,以便我可以返回单元格中的每个对象而不是整个字符串。 正如上面 Sanjeev 和 Luis 的回答,您的 sList 对象不包含所有 Student 对象。 如何让它包含所有学生对象? 我已经删除了多余的 sList = new ArrayList();例如,但我仍然返回分隔字符串而不是单个学生对象。 您在 sList 中添加 Student 对象并通过 Servlet 传递给 JSP。但是在 JSP 上,您只是在执行 studt.get(i) ,它将调用 Student.toString() 方法。相反,在 JSP 中,您应该执行以下操作: studt = (ArrayList)request.getAttribute("stulist");for (int i = 0; i ... ==== 抱歉 ***.com cmets 不允许格式化代码。【参考方案2】:

您正在 getStudentList() 上创建 ArrayList 的实例 只需从该方法中删除此行sList = new ArrayList&lt;Student&gt;();

【讨论】:

【参考方案3】:

问题出在getStudentList()方法,不需要每次都新建一个ArrayList

sList = new ArrayList<Student>(); 

必须移出while循环

【讨论】:

以上是关于需要来自 txt 文件的数据,以逗号分隔,以使用现有类中的对象填充数组列表的主要内容,如果未能解决你的问题,请参考以下文章

点云读写:读写txt点云(空格分隔 | 逗号分隔)

点云读写:读写txt点云(空格分隔 | 逗号分隔)

将文件读入以逗号和换行符分隔的向量

C读取以逗号分隔的数字文件

MSSQL查询回显列之间用逗号分隔开怎么操作?

以逗号作为小数分隔符的数据框