1

可能重复:
需要帮助创建一个从书中打印目录的 java 程序

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

亚瑟王宫......................................3

圆桌骑士团............ 8

幽默家迪纳丹爵士..................................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

谁能帮我纠正我的循环以生成我的输出。我愿意接受建议。

谢谢!

4

3 回答 3

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());
}
于 2012-09-22T00:03:58.553 回答
1

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

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);
}
于 2012-09-22T00:03:29.940 回答
0

这看起来很像家庭作业......嗯,首先toc_curlen = toc_curlen++;应该将这行缩短为toc_curlen++;(想想为什么)。

您真正的问题在于您用于打印的 for 循环。看看你在打印什么,你会发现它。

于 2012-09-22T00:03:18.823 回答