可能重复:
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
任何人都可以帮我纠正我的循环以生成我的输出。我愿意接受建议。
谢谢!
答案 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循环。仔细查看您正在打印的内容,您将发现它。