我需要根據代碼中的Javadoc實作一個名為saveWorksToFile的方法。
where ARTIST_NAME?
其中ARTIST_NAME是藝術家的名字,NUM_WORKS是該藝術家的作品數量 是該藝術家的作品數量,而WORK_1、WORK_2等是該藝術家每個作品的toString表示。 每個藝術家的作品的toString表示。
最后一件作品后面不應該有一個行的分隔符。
如果一個藝術家沒有作品,那么上述格式的前三行應該被寫成 寫,其中"-----"一行后面有一個分隔符。
這就是代碼。
而這是我的代碼:
import java.io.BufferedWriter。
import java.io.IOException;
import java.io.Writer。
import java.util.ArrayList;
import java.util.List;
import java.util.StringJoiner;
public class Artist {
static class Work {
String name; //e.g. "Mona Lisa"
int yearCreated; //例如:1506。
String medium; //e.g. "Oil on poplar panel"
public Work(String name, int yearCreated, String medium) {
this.name = name;
this.yearCreated = yearCreated;
this.medium = medium。
}
public String getName() { return name; }
public int getYearCreated() { return yearCreated; }
public String getMedium() { return mid; }
@Override
public String toString() {
return name "|"/span> yearCreated "|"/span> medium;
}
}
private String name; //e.g. "Henri Matisse"
private List<Work> works = new ArrayList<> ()。
public Artist(String name){
this.name = name。
}
public void addWork(Work work) {
this.works.add(work)。
}
/**。
* 將該藝術家的每個作品的toString表示寫到給定的寫入器中。
* 給定的寫入器。同時寫下包含藝術家名字和作品數量的標題行。
* 作品的數量。
*
* 如果發生IOException,應將 "發生IOException "的訊息
* 列印到System.out。
*
* @param writer writer將這個藝術家的作品寫到
*/
public void saveWorksToFile(Writer writer) {
//在這里寫下你的代碼。
try {
BufferedWriter buffer = new BufferedWriter( writer)。
buffer.write(this.name)。
buffer.newLine()。
buffer.write("works: " this.works.size()>。)
buffer.close()。
}
catch (IOException e) {
System.out.println("IOException occurred")。
}
}
我得到了這些錯誤:
我得到了這些錯誤。
=> org.junit.ComparisonFailure: 預期值是。Vincent van Gogh[newline]作品。0[newline]-----[newline] expected:< ...nt van Gogh
=> org.junit.ComparisonFailure。預期值是。Vincent van Gogh[換行]作品。0[newline]-----[newline] expected:< ...nt van Gogh
=> org.junit.ComparisonFailure。預期值是。Vincent van Gogh[換行]作品。0[newline]-----[newline] expected:< ...nt van Gogh
=> org.junit.ComparisonFailure。預期值為。Claude Monet[newline]作品。2[newline]-----[newline]Bridge over a Pond of Water Lilies|1899|Oil on canvas[newline]Impression, Sunrise|1872|Oil on canvas預計:< 。 ...laude Monet
=> org.junit.ComparisonFailure。預期值是。Claude Monet[newline]作品。2[newline]-----[newline]Bridge over a Pond of Water Lilies|1899|Oil on canvas[newline]Impression, Sunrise|1872|Oil on canvas預計:< 。 ...laude Monet
=> org.junit.ComparisonFailure。預期值是。亨利-馬蒂斯[換行]作品。1[newline]-----[newline]Woman with a Hat|1905|Oil on canvas expected:< ...nry Matisse
=> org.junit.ComparisonFailure。預期值為。亨利-馬蒂斯[換行]作品。1[newline]-----[newline]Woman with a Hat|1905|Oil on canvas expected:< ...nry Matisse
=> org.junit.ComparisonFailure。預期值為。亨利-馬蒂斯[換行]作品。1[newline]-----[newline]Woman with a Hat|1905|Oil on canvas expected:< ...nry Matisse
=> org.junit.ComparisonFailure。預期值為。Claude Monet[newline]作品。2[newline]-----[newline]Bridge over a Pond of Water Lilies|1899|Oil on canvas[newline]Impression, Sunrise|1872|Oil on canvas預計:< ...laude Monet
我在創建新行時遇到困難,我試過和新行。
和newLine()方法,但都不起作用。另外,顯示串列中的作品數量應該是正確的。對于回圈,我認為在這種情況下,我應該使用for回圈來回圈瀏覽藝術作品。
任何提示/幫助都將是巨大的,謝謝!
uj5u.com熱心網友回復:
你可以使用json格式來輕松地保存你的資料,并且像這樣初始化
public void saveWorksToFile(outputStreamWriter writer) {
//在這里寫下你的代碼。
JSONObject jsonObject = new JSONObject() 。
try {
jsonObject.put("ARTIST_NAME",this.name)。
jsonObject.put("NUM_WORKS",this.works.size()) 。
for (int i=0;i<works.size() ;i ) {
jsonObject.put("work_" i, works.get(i).toString()) 。
// you can save work as a byte array or json string so you could easily import the data back.
}
BufferedWriter buffer = new BufferedWriter( writer)。
buffer.write(jsonObject.toString() "
")。)
buffer.close()。
}
catch (IOException | JSONException e) {
System.out.println("IOException occurred")。
}
}
public Artist readFromFile(File file){
Artist artist = null;
FileReader fileReader = null;
字串= null。
緩沖讀物bufferedReader。
try {
fileReader = new FileReader(file)。
bufferedReader = new BufferedReader(fileReader)。
line = bufferedReader.readLine()。
while (line != null){
line = "
"。
JSONObject jsonObject = null。
try {
jsonObject = new JSONObject(line);
String name = jsonObject.get("ARTIST_NAME").toString();
int works_num = Integer.parseInt(jsonObject.get("NUM_WORKS").toString())。
//這里你可以將作品匯入為一個字串。
artist = new Artist(name)。
} catch (JSONException e) {
e.printStackTrace()。
}
line = bufferedReader.readLine();
}
bufferedReader.close()。
} catch (IOException e) {
e.printStackTrace()。
}
return藝術家。
}
uj5u.com熱心網友回復:
下面是我對方法saveWorksToFile的代碼。這是你問題中唯一被我改變的代碼部分。(代碼后的注釋。)
public void saveWorksToFile( Writer writer) {
try {
writer.write(this.name)。
writer.write(System.lineSeparator())。
writer.write("works: " this.works.size()>。)
writer.write(System.lineSeparator())。
writer.write("--")。
writer.write(System.lineSeparator())。
boolean first = true;
for (Work work : works) {
if (first) {
first = false;
}
else {
writer.write(System.lineSeparator())。
}
writer.write(work.toString())。
}
}
catch (IOException e) {
System.out.println("IOException occurred")。
}
你不應該將Writer引數包裹在一個BufferedWriter中。一般來說,對于任何方法,你通常不應該需要鑄造引數。因此,在上面的代碼中,我只使用Writer類的方法。還要注意的是,我沒有關閉Writer,因為這應該留給呼叫方法saveWorksToFile的代碼。
為了寫一個行分隔符,我呼叫了java.lang.System類的lineSeparator方法。
為了每行列印所有藝術家的作品,我使用了一個回圈。
為了確保藝術家作品串列中的最后一個條目不需要分行符,第一個作品不需要分行符,之后的每一個作品都要在前面加一個分行符。
下面是我為測驗上述代碼而寫的一個方法。它使用了java.io.StringWriter類,這是Writer的子類,因為Writer類是抽象的,沒有公共建構式。一般來說,你不能實體化一個抽象的類。你需要使用一個具體的子類。我使用StringWriter,以便能夠輕松地將其內容列印到螢屏上。如果你想寫到一個實際的檔案,你可以使用java.io.FileWriter類。
/**.
* import java.io.StringWriter
*/
public static void main(String[] args){
Artist artist = new Artist("Vincent van Gogh") 。
StringWriter sw = new StringWriter() 。
artist.saveWorksToFile(sw)。
System.out.print(sw)。
System.out.println()。
artist = new Artist("Claude Monet"/span>)。
Work work = new Work("Bridge over a Pond of Water Lilies", 1899, "布面油畫")。)
artist.addWork(work);
work = new Work("印象,日出", 1872, "Oil on canvas") 。
artist.addWork(work);
sw = new StringWriter() 。
artist.saveWorksToFile(sw)。
System.out.print(sw)。
System.out.println()。
artist = new Artist("Henri Matisse")。
work = new Work("Woman with a Hat", 1905, "Oil on canvas") 。
artist.addWork(work);
sw = new StringWriter() 。
artist.saveWorksToFile(sw)。
System.out.print(sw)。
這是我在運行上述main方法時得到的輸出。
Vincent van Gogh
作品。0
---
Claude Monet
作品: 2
---
橋上的睡蓮|1899|布面油畫
印象,日出》|1872|布面油畫
亨利-馬蒂斯
作品。1
---
戴帽子的女人》|1905|布面油畫
uj5u.com熱心網友回復:
我的建議是,你把類分開,有時很難弄清問題。我是這樣分離的。
import java.io.BufferedWriter。
import java.io.FileWriter。
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Artist {
private String name; //e.g. "Henri Matisse"
private List<Work> works = new ArrayList<> ()。
public Artist(String name){
this.name = name。
}
public void addWork(Work work) {
this.works.add(work)。
}
public void saveWork(){
try{
BufferedWriter writer = new BufferedWriter(
new FileWriter("path where want to save"/span>))。
writer.write(this.name)。
writer.newLine();
writer.write("works: " this.works.size()>。)
writer.newLine()。
this.works.forEach(work -> {
try {
writer.write(work.name);
writer.newLine()。
} catch (IOException e) {
e.printStackTrace()。
}
});
writer.close()。
} catch(IOException e) {
e.printStackTrace()。
}
}
}
public class Work {
String name; //e.g. "Mona Lisa"
int yearCreated; //例如:1506。
String medium; //e.g. "Oil on poplar panel"
public Work(String name, int yearCreated, String medium) {
this.name = name;
this.yearCreated = yearCreated;
this.medium = medium。
}
public String getName() { return name; }
public int getYearCreated() { return yearCreated; }
public String getMedium() { return mid; }
@Override
public String toString() {
return name "|"/span> yearCreated "|"/span> medium;
}
}
public class Main {
public static void main(String[] args){
Work work1 = new Work("Fast1", 2019,"ss")。)
Work work2 = new Work("Fast2", 2019,"ss")。)
Artist artist = new Artist("Artist_Tom_Cruise") 。
artist.addWork(work1);
artist.addWork(work2);
藝術家.saveWork()。
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/327338.html
標籤:

