java比對兩個txt檔 ㄧ樣的字刪除後輸出比對後結果”急”

請問要如何去改這支程式,a.txt裡的資料是:(我們 妳 我 她 很好),b.txt裡的資料是(我們 也 快點 學校),兩個內容都是用空白隔開,而不是用" ",輸出結果應該是我們會被刪掉然後輸出另一個txt,請問要怎ㄇ改讓它可以刪除,而且是要把刪除後的結果存成另一個txt檔.如果可以的話最好幫我註解一下程式碼,因小的還是新手, 之前有發問過ㄧ位好心的大大,不過發問的時間太短,自己又改不好,所以在上來請高手幫忙,婐跑了這支程式後,好像沒有輸出結果,如果方便的話,麻煩貼完整的程式,

import java.io.*;

public class segtest {

public static void main(String[] args) throws IOException {

File myFile = new File("a.txt");

File myFile2 = new File("b.txt");

FileReader fr = new FileReader(myFile);

BufferedReader br = new BufferedReader(fr);

String Line = br.readLine();

int count = 0;

String str[] = new String[20];

String str2[] = new String[150];

String temp = new String("");

while (Line != null) {

for (int i = 0; i < Line.length(); i++) {

if (Line.charAt(i) == ' ') {

count++;

temp = "";

} else {

temp += Line.charAt(i);

str[count] = temp;

}

}

Line = br.readLine();

}

fr = new FileReader(myFile2);

br = new BufferedReader(fr);

Line = br.readLine();

count = 0;

temp = "";

while (Line != null) {

for (int i = 0; i < Line.length(); i++) {

if (Line.charAt(i) == ' ') {

count++;

temp = "";

} else {

temp += Line.charAt(i);

str2[count] = temp;

}

}

Line = br.readLine();

}

for (int i = 0; i < str.length; i++) {

for (int j = 0; j < str2.length; j++) {

if (str[i] == str2[j])

str[i] = " ";

}

}

}

}

已更新項目:

不好意思,程式有出錯麻煩大大幫我看看

在try區塊裡的i 有錯誤訊息"i cannot be resolved"

請問要如何解決

2 個已更新項目:

錯誤訊息我解決了

只不過是現在比對後的內容有問題

a.txt裡的內容是(你 好 嗎 不好 可以)

b.txt裡的內容是(一 比 開始 不要 可以)

結果c.txt輸出後只有(你)

請問是迴圈裡的問題嗎

3 個已更新項目:

還有請問

while兩個迴圈裡的程式碼

可以幫我註解一下嗎

我看不太懂

4 個已更新項目:

比對的結果只會輸出a.txt的第一個token

我是想要讓結果是a,b兩個txt檔比對後的結果

把不一樣的token留下來

請問大大藥如何解決

5 個已更新項目:

程式碼有錯誤

ArrayList ar1 = new ArrayList (64);

ArrayList ar2 = new ArrayList (64);

出現Muliple markers at line

-Syntax error,parameterized types are only available if source level is 5.0

6 個已更新項目:

for(String s : ar1)

for(String s : ar2)

錯誤Syntax error,"for each"statements are only available if source level is 5.0

還有可以麻煩幫我註解嗎

7 個已更新項目:

無名氏大大 還是有錯誤

而且這次錯誤比較多說

8 個已更新項目:

請問要在哪裡改^^

9 個已更新項目:

無名氏大大

我不曉得在哪邊改

進去後找不到

10 個已更新項目:

吉他手大大

妳的輸出結果 不是我想要的結果說

我是要輸出 比對後不ㄧ樣的token

可是妳的是輸出 ㄧ樣的

11 個已更新項目:

無名氏大大

剛那個問題我解決了

是現在輸出的結果 不太依樣

輸出的結果是要比對後

a跟b比對後要留下a裡的不同的token

12 個已更新項目:

無名氏大大 請問這個錯誤是指什麼

Exception in thread "main" java.lang.NullPointerException

at java.util.StringTokenizer. (Unknown Source)

at java.util.StringTokenizer. (Unknown Source)

at segtest.main(segtest.java:38)

13 個已更新項目:

無名氏大大

成功了^^

很感謝你喔

14 個已更新項目:

感謝另外兩位大大的幫忙

不過無名氏大大的解答比較符合我的需要

所以選他為最佳解答囉

謝謝各位

我會好好學習的

4 個解答

評分
  • 1 0 年前
    最佳解答

    這是我用StringTokenizer寫的版本程式只有49行,

    還蠻短的,而且也蠻容易懂的,

    如果需要注解的話再跟我說!我再注解!^^~

    直接我上傳的網頁好了!

    http://j600920909.myweb.hinet.net/web/testfile.htm...

    上面這個!^^~

    下面是原始碼(不過奇摩排版太差XD)

    import java.io.*;

    import java.util.*;

    import java.text.*;

    public class testfile {

    public static void main(String[] args) throws IOException {

    BufferedReader br = new BufferedReader(new FileReader(new File("a.txt")));

    ArrayList<String> ar1 = new ArrayList<String>(64);

    ArrayList<String> ar2 = new ArrayList<String>(64);

    String line;

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

    {

    StringTokenizer token = new StringTokenizer(line, " ");

    while(token.hasMoreTokens())

    ar1.add(token.nextToken());

    }

    br.close();

    br = new BufferedReader(new FileReader(new File("b.txt")));

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

    {

    StringTokenizer token = new StringTokenizer(line, " ");

    while(token.hasMoreTokens())

    {

    String t = token.nextToken();

    if(ar1.contains(t))

    ar1.remove(t);

    else

    ar2.add(t);

    }

    }

    br.close();

    BufferedWriter wr = new BufferedWriter(new FileWriter(new File("c.txt")));

    for(String s : ar1)

    wr.write(s + " ");

    for(String s : ar2)

    wr.write(s + " ");

    wr.close();

    }

    }

    2008-08-09 11:48:38 補充:

    import java.text.*;

    這行好像用不到@@"

    那個是StringBuilder的,

    突然想到沒有用到XD,

    網頁上的程式碼我也更新了!^^~

    有問題的話就發問吧!^^~

    2008-08-09 11:57:28 補充:

    疑~你是用Eclipse 編譯嗎?

    還是用WINDOWS 的命令提示字元?

    因為用Eclipse會發生你說的那個問題,

    要調編譯器選項,

    5.0以上的jdk都有for each的功能。

    要記得在ArrayList加上

    這也是JDK 5.0以後才有的功能。

    Eclipse要調下面的選項,

    在eclipse下,Windows->Preferences->Java(Java)->Complier,

    裡面的Compiler compilance level 設置為6.0 (如果你用5.0也出現這種現象,就選5.0)。然後apply。

    問題就解決了。

    2008-08-09 12:21:30 補充:

    我已經將注解打好了!^^~

    你到我上面說的那個網址就行了!

    你說的那個問題一直沒辦法解決的話,

    你可以看你是哪一個版本的jdk,

    搞不好是jdk的問題,

    如果是JDK1.5.0以上的話,

    那我可以建議你一開始寫JAVA程式的時候,

    最好還是使用WINDOWS下的命令提示字元來執行會比較好。

    就是

    javac testfile.java

    java testfile

    我想這兩行指令應該很熟吧!^^~

    你可以試試看!

    2008-08-09 12:42:07 補充:

    我已經改好了!

    我上傳到我那個網頁上了!^^~

    上去看就行了!

    基本上應該就這樣了!

    有問題的話再發問吧!^^~

    2008-08-09 12:59:23 補充:

    NullPointerException 指得就是得到東西null值@@",

    你的a.txt和b.txt檔案是長怎樣子???

    可能是a.txt 和 b.txt檔案內容的關係,

    你要不要po出來給我們看一下?^^~

    2008-08-09 13:29:40 補充:

    我稍微講一下吉他手的作法,

    吉他手的作法大概是他PO太快可能有小失誤,

    只要將

    if(a[i].equals(b[j]))

    改成if(!a[i].equals(b[j]))

    只要多加個驚嘆號就行了!

    他是採Regare Expression(簡稱RE)的方法來分割字串,

    Regare Expression中文叫 正規化表達式,

    就是使用String提供的Split函式分割函式來做,

    也是一種不錯的法寫,

    也蠻簡單的,

    他的寫法如果只要留b的話,

    就把

    cTxt = a[i];

    改成

    cTxt = a[j];

    就行了,

    而我是使用ar1存a,ar2存b這樣。

    2008-08-09 13:38:39 補充:

    我好像拼錯英文了!XD

    正規化表達式 是 Regular Expression

    蠻不錯用的東西就是了!

    還蠻常用到的,

    你可以認識一下,

    對你有幫助。^^~

  • 1 0 年前

    什麼年代了還在用StringTokenizer token = new StringTokenizer();幫幫忙split( )去學一下好不好。

    永遠的壞習慣,類別名稱用小寫開頭。

  • 吉他
    Lv 5
    1 0 年前

    import java.io.*;

    public class segtest

    {

    public static void main(String[] args) throws IOException

    {

    String aTxt = "", bTxt = "", cTxt = "";

    String [] a = null,b = null;

    //建立讀取檔案的物件

    BufferedReader ain = new BufferedReader(new FileReader("a.txt"));

    //建立讀取檔案的物件

    BufferedReader bin = new BufferedReader(new FileReader("b.txt"));

    //建立入寫c.txt檔案的物件

    PrintWriter outs = new PrintWriter(new FileWriter("c.txt"));

    //讀取a.txt

    while((aTxt = ain.readLine()) != null)

    a = aTxt.split("\\s");

    ain.close();

    //讀取b.txt

    while((bTxt = bin.readLine()) != null)

    b = bTxt.split("\\s");

    bin.close();

    //比對a.txt與b.txt相同的字句

    for(int i = 0; i < a.length; i )

    {

    for(int j = 0; j < b.length; j )

    {

    System.out.println(a[i] "==" b[j]);

    if(a[i].equals(b[j]))

    cTxt = a[i];

    }

    }

    //寫入c.txt

    outs.println(cTxt);

    outs.close(); //關閉存檔

    }

    }

    說明:

    我的做法只使用了String的split("\\s") method,\\s表示空白字元,這個method可以將用字串中你指定要做為分隔的字元去將字串做分開,會回傳一個字串陣列,最後我在用for去比對你兩個字串陣列裡是否有一樣的字句

    2008-08-09 12:02:55 補充:

    //更正,此行做測試用,刪除就行了

    System.out.println(a[i] "==" b[j]);

    參考資料: java 吉他手
  • 1 0 年前

    import java.io.*;

    public class segtest {

    public static void main(String[] args) throws IOException {

    File myFile = new File("a.txt");

    File myFile2 = new File("b.txt");

    FileReader fr = new FileReader(myFile);

    BufferedReader br = new BufferedReader(fr);

    String Line = br.readLine();

    int count = 0;

    String str[] = new String[20];

    String str2[] = new String[150];

    String temp = new String("");

    while (Line != null) {

    for (int i = 0; i < Line.length(); i++) {

    if (Line.charAt(i) == ' ') {

    count++;

    temp = "";

    } else {

    temp += Line.charAt(i);

    str[count] = temp;

    }

    }

    Line = br.readLine();

    }

    fr = new FileReader(myFile2);

    br = new BufferedReader(fr);

    Line = br.readLine();

    count = 0;

    temp = "";

    while (Line != null) {

    for (int i = 0; i < Line.length(); i++) {

    if (Line.charAt(i) == ' ') {

    count++;

    temp = "";

    } else {

    temp += Line.charAt(i);

    str2[count] = temp;

    }

    }

    Line = br.readLine();

    }

    for (int i = 0; i < str.length; i++) {

    for (int j = 0; j < str2.length; j++) {

    if (str[i] == str2[j])

    str[i] = " ";

    str2[j] = "";

    }

    }

    try {

    BufferedWriter out = new BufferedWriter(new FileWriter("c.txt"));

    for(i = 0; i < str.length;i++){

    if(str[i] != ""){

    out.write(str[i]);

    out.write(" ");

    }

    for(i = 0; i < str2.length;i++){

    if(str2[i] != ""){

    out.write(str2[i]);

    out.write(" ");

    }

    }

    out.close();

    } catch (IOException e) {

    }

    }

    }

還有問題?馬上發問,尋求解答。