创建输出目录的Java程序

时间:2012-09-21 23:34:04

标签: java loops

  

可能重复:
  Need help creating a java program that prints a table of contents from a book

我应该创建一个输出目录的程序。让我给你们一个我的任务背景。用户应该在循环中输入章节标题和起始页码,直到用户为章节标题输入4个星号。用户输入4个星号后,我应该打印输出,如

亚瑟王的法庭............................. 3

桌上骑士...... ............ 8

Sir Dinadan the Humorist .................. 12

我认为我的大部分编码都是正确的。在我的测试程序中,我创建了一个while循环,允许用户输入章节标题和起始页码。当用户为章节标题输入4个星号时,此循环将终止。但是,我停留在我的while循环之后,在用户输入星号后生成输出。我没有显示目录,而是获得输出。我尝试使用for循环打印标题,点和页码,但它只显示星号。我认为循环是错误的。

到目前为止,这是我的代码:

// My Table of Contents class
public class TocEntry
{

public TocEntry(String title, int page) // 2 Argument Constructor
{
           chapterTitle = title;
           startPage = page;
}


public String toString() // toString method to print out chapter title,
                         // given dots, and start page
{
    String temp = "" + startPage;
    int numDots = 60 - (temp.length()+ chapterTitle.length());

    String toc_out = chapterTitle;
    for(int i = 0; i < numDots; i++)
       toc_out=toc_out +".";
       toc_out= toc_out + startPage;
    return toc_out;
}


private String chapterTitle; 
private int startPage;


    }// End of class TocEntry

// My Test program
import java.util.Scanner;
public class useToEntry {

public static void main(String[] args)
{
    Scanner input = new Scanner(System.in);

    final int TOCSIZE = 100;// Max size of TOC
    TocEntry toc[] = new TocEntry[TOCSIZE];
    int toc_curlen = 0;// The toc_curlen is intended to keep track of the number 
                       // of chapters entered by the user

    System.out.print("Enter chapter title: ");
    String chapterTitle = input.next();

    while(!"****".equals(chapterTitle))
    {
       System.out.print("Enter starting page number: ");
       int page = input.nextInt();

       System.out.print("Enter chapter title: ");
       chapterTitle= input.next();

       toc [toc_curlen] = new TocEntry(chapterTitle,page);
       toc_curlen = toc_curlen++;

    }// End of while loop

       for (int line = 0; line < toc_curlen; line++)
       {
         System.out.println(chapterTitle.toString());
       }// End of for loop
  }// End of main method

}// End of class useToEntry

任何人都可以帮我纠正我的循环以生成我的输出。我愿意接受建议。

谢谢!

3 个答案:

答案 0 :(得分:2)

一些建议:

该行

toc_curlen = toc_curlen++;

会导致toc_curlen永远不会增加。您可以单独使用增量运算符:

toc_curlen++;

您第一次使用

String chapterTitle = input.next();

您永远不会将其分配给TocEntry数组toc,因此本章将永远不会显示。

您正在显示循环中重复打印变量chapterTitle - 您应该在此处打印TocEntry

for (int line = 0; line < toc_curlen; line++) {
   System.out.println(toc[line].toString());
}

答案 1 :(得分:1)

我修改了你的代码。首先,当您想要组合大量字符串时,请考虑使用StringBuilder而不是+运算符。字符串是不可变的,因此每次使用+运算符时,都会创建一个新的String,并且连接的两个字符串将进入垃圾:

public String toString()
{
    String temp = Integer.toString(startPage);
    int numDots = 60 - (temp.length() + chapterTitle.length());

    StringBuilder sb = new StringBuilder();
    sb.append(chapterTitle);
    for (int i = 0; i < numDots; i++)
        sb.append('.');

    sb.append(startPage);
    return sb.toString();
}

但问题是,你没有遍历你的数组,只打印了当前的章节标题:

for (int line = 0; line < toc_curlen; line++)
{
    System.out.println(chapterTitle.toString());
}

这是main()函数的“更好”版本:

public static void main(String[] args)
{
    Scanner input = new Scanner(System.in);
    //its much easier to work with lists
    List<TocEntry> list = new ArrayList<TocEntry>();
    String chapterTitle = "";

    //sorry for the while(true), but it looks easier doing everything 
    //inside the loop instead ofdoing half the job outside, half inside of it.
    while (true)
    {
        System.out.print("Enter chapter title: ");
        chapterTitle = input.next();
        if("****".equals(chapterTitle)) break;

        System.out.print("Enter starting page number: ");
        int page = input.nextInt();

        list.add(new TocEntry(chapterTitle, page));
    }

    for (TocEntry entry : list)
        System.out.println(entry);
}

答案 2 :(得分:0)

这看起来非常像家庭作业...... 好吧,首先应将toc_curlen = toc_curlen++;行缩短为toc_curlen++;(考虑原因)。

你真正的问题在于你用于打印的for循环。仔细查看您正在打印的内容,您将发现它。