【问题标题】:How can i show it at first?一开始怎么显示?
【发布时间】:2010-01-23 08:34:56
【问题描述】:

我写了一个简单的java应用,有问题请帮帮我;

我有一个文件(只是示例):

1.TXT
-------
SET MRED:NAME=MRED:0,MREDID=60;
SET BCT:NAME=BCT:0,NEPE=DCS,T2=5,DK0=KOR;
CREATE LCD:NAME=LCD:0;
-------

这是我的源代码

import java.io.IOException;
import java.io.*;
import java.util.StringTokenizer;

class test1 {

    private final int FLUSH_LIMIT = 1024 * 1024;
    private StringBuilder outputBuffer = new StringBuilder(
            FLUSH_LIMIT + 1024);
    public static void main(String[] args) throws IOException {
        test1 p=new test1();
        String fileName = "i:\\1\\1.txt";
        File file = new File(fileName);
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line;
        while ((line = br.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(line, ";|,");
            while (st.hasMoreTokens()) {
                String token = st.nextToken();
                p.processToken(token);

            }
        }
        p.flushOutputBuffer();
    }

    private void processToken(String token) {
        if (token.startsWith("MREDID=")) {
            String value = getTokenValue(token,"=");
            outputBuffer.append("MREDID:").append(value).append("\n");
        } else if (token.startsWith("DK0=")) {
            String value = getTokenValue(token,"=");
            outputBuffer.append("DK0=:").append(value).append("\n");
        } else if (token.startsWith("NEPE=")) {
            String value = getTokenValue(token,"=");
            outputBuffer.append("NEPE:").append(value).append("\n");
        }
        if (outputBuffer.length() > FLUSH_LIMIT) {
            flushOutputBuffer();
        }
    }

    private String getTokenValue(String token,String find) {
        int start = token.indexOf(find) + 1;
        int end = token.length();
        String value = token.substring(start, end);
        return value;
    }

    private void flushOutputBuffer() {
        System.out.print(outputBuffer);
        outputBuffer = new StringBuilder(FLUSH_LIMIT + 1024);
    }

}

我想要这个输出:

MREDID:60
DK0=:KOR
NEPE:DCS

但是这个应用程序向我展示了这个:

MREDID:60
NEPE:DCS
DK0=:KOR

请告诉我如何处理这个问题,因为首先必须是 DK0,这只是一个示例;我的真实应用程序有 14000 行

谢谢...

【问题讨论】:

  • 从对我的回答的评论中,我猜我并不完全理解您要解决的问题。您是否希望 MREDID、DK0 和 NEPE 在您的文件中出现不止一次,并且您想将它们全部打印出来吗?实际上,您是否希望以特定顺序打印更多数量的唯一令牌,而您的源代码中的三个仅作为示例?
  • 是的,完全正确;你能帮我吗...
  • 在这种情况下,我假设 mredid、nepe 和 dk0 可能会出现多次。您想以下列方式打印它们:mredid, dk0, nepe, mredid, dk0, nepe... 还是 mredid, mredid, dk0, dk0, nepe, nepe?请编辑您的问题,也许使用稍大的示例 txt 文件。

标签: java split stringtokenizer


【解决方案1】:

不是在读取时输出值,而是将其放入哈希图中。读完整个文件后,通过从 hashmap 中获取值以您想要的顺序输出。

【讨论】:

  • 很好的电话!当一个像第三世界人一样写作的美国人甚至不解释他想用他的程序做什么时,我通常会置之不理。
【解决方案2】:

使用HashTable 存储值并在解析所有标记后按所需顺序从中打印。

//initialize hash table
HashTable ht = new HashTable();

//instead of outputBuffer.append, put the values in to the table like
ht.put("NEPE", value);
ht.put("DK0", value); //etc

//print the values after the while loop
System.out.println("MREDID:" + ht.get("MREDID"));
System.out.println("DK0:" + ht.get("DK0"));
System.out.println("NEPE:" + ht.get("NEPE"));

【讨论】:

    【解决方案3】:

    创建一个类,比如

    class data {
       private int mredid;
       private String nepe;
       private String dk0;
    
       public void setMredid(int mredid) {
          this.mredid = mredid;
       }
    
       public void setNepe(String nepe) {
          this.nepe = nepe;
       }
    
       public void setDk0(String dk0) {
          this.dk0 = dk0;
       }
    
       public String toString() {
          String ret = "MREDID:" + mredid + "\n";
          ret = ret + "DK0=:" + dk0 + "\n";
          ret = ret + "NEPE:" + nepe + "\n";
       }
    

    然后将processToken改为

    private void processToken(String token) {
        Data data = new Data();
        if (token.startsWith("MREDID=")) {
            String value = getTokenValue(token,"=");
            data.setMredid(Integer.parseInt(value));
        } else if (token.startsWith("DK0=")) {
            String value = getTokenValue(token,"=");
            data.setDk0(value);
        } else if (token.startsWith("NEPE=")) {
            String value = getTokenValue(token,"=");
            data.setNepe(value);
        }
        outputBuffer.append(data.toString());
        if (outputBuffer.length() > FLUSH_LIMIT) {
            flushOutputBuffer();
        }
    }
    

    【讨论】:

    • 谢谢,但正如我的消息;我的应用程序有 14000 行,setter 不适合它...
    猜你喜欢
    • 2013-06-12
    • 2011-01-21
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2015-08-25
    • 1970-01-01
    相关资源
    最近更新 更多