2

我目前正在写我的论文,在这种情况下,我需要使用 java 开发一个元启发式算法。但是,我在尝试读取和存储数据时遇到了问题。

我的文件是一个文本文件,大约有 150 行。问题的一个例子是在第 5 行,其中声明了三个整数:30、38 和 1。我想将它们中的每一个存储为分别称为 L、T 和 S 的整数,这适用于许多其他的线。

你们有谁知道怎么做吗?如果需要,我可以将 txt 文件发送给您。

顺便说一句:这是我迄今为止尝试过的:

主.java:

import java.io.IOException;
import java.io.FileWriter;
import java.io.BufferedWriter;


public class MAIN {

public static void main(String[] args) throws IOException {
    Test.readDoc("TAP_T38L30C4F2S12_03.txt");
    }   
}

测试.java:

import java.io.*;
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map;

public class Test {

private static ArrayList<Integer> integerList = new ArrayList<Integer>();
public static Map<String, ArrayList<Integer>> data = new HashMap<String,               ArrayList<Integer>>();
public static String aKey;

public static void readDoc(String File) {

try{
FileReader fr = new FileReader("TAP_T38L30C4F2S12_03.txt");
BufferedReader br = new BufferedReader(fr);

while(true) {
    String line = br.readLine();
    if (line == null) 
    break;
else if (line.matches("\\#\\s[a-zA-Z]")){
    String key = line.split("\\t")[1];
    line = br.readLine();
    data.put(key, computeLine(line));
    }
else if (line.matches("\\\\\\#\\s(\\|[a-zA-Z]\\|,?\\s?)+")){
     String[] keys = line.split("\\t");
     line = br.readLine();
     ArrayList<Integer> results = computeLine(line);
     for (int i=0; i<keys.length; i++){
          aKey = aKey.replace("|", "");
        //  data.put(aKey, results.get(i));
          data.put(aKey, results);
     }
    }
    System.out.println(data);

    }
} catch(Exception ex) {
    ex.printStackTrace();      }    
}


private static ArrayList<Integer> computeLine (String line){
    String[] splitted = line.split("\\t");
    for (String s : splitted) {
    integerList.add(Integer.parseInt(s));
    }

    return integerList;
}

}

数据示例如下所示:

     \# TAP instance 
     \# Note that the sequence of the data is important!
     \#
     \# |L|, |T|, |S|
     30 38  1
     \#
     \# v
     8213   9319    10187   12144   8206    ...
     \#
     \# w
     7027   9652    9956    13973   6661    14751   ...
     \#
     \# b
     1  1   1   1   1   ...
     \#
     \# c
     1399   1563    1303    1303    2019    ...
     \#
     \# continues
4

2 回答 2

2

以下代码正在使用您提供的示例数据。

简而言之

  1. 创建一个字段来存储您的数据,我选择了一个TreeMap,这样您就可以将一个字母映射到一定数量的整数,但您可以使用另一个Collection

  2. 使用逐行读取文件BufferedReader#readLine()

  3. 然后根据您的数据处理每一行。在这里,我使用regular expressions匹配给定的行,然后删除所有不是数据的内容。见String#split()String#matches()

在此之前,请先阅读一些关于 Java 和面向对象设计的优秀初学者书籍。

public class ReadAndParse {

    public Map<String, ArrayList<Integer>> data = new TreeMap<String, ArrayList<Integer>>();

     public ReadAndParse() {
        try {
            FileReader fr = new FileReader("test.txt");
            BufferedReader br = new BufferedReader(fr);
            while(true) {
                String line = br.readLine();
                if (line == null)    break;

                else if (line.matches("\\\\#\\s[a-zA-Z]")){
                    String key = line.split("\\s")[1];
                    line = br.readLine();

                    ArrayList<Integer> value=  computeLine(line);

                    System.out.println("putting key : " + key + " value : " + value);
                    data.put(key, value);
                }
                else if (line.matches("\\\\\\#\\s(\\|[a-zA-Z]\\|,?\\s?)+")){
                    String[] keys = line.split("\\s");
                    line = br.readLine();

                    ArrayList<Integer> results = computeLine(line);

                    for (int i=1; i<keys.length; i++){
                        keys[i] = keys[i].replace("|", "");
                        keys[i] = keys[i].replace(",", "");

                        System.out.println("putting key : " + keys[i] + " value : " + results.get(i-1));

                        ArrayList<Integer> value=  new ArrayList<Integer>();
                        value.add(results.get(i-1));
                        data.put(keys[i],value);
                    }
                }
            }

        } 
        catch (IOException e) {
            e.printStackTrace();
        }

        // print the data
        for (Entry<String, ArrayList<Integer>> entry : data.entrySet()){
            System.out.println("variable : " + entry.getKey()+" value : "+ entry.getValue() );
        }
}

    // the compute line function
    private ArrayList<Integer> computeLine(String line){
        ArrayList<Integer> integerList = new ArrayList<>();
        String[] splitted = line.split("\\s+");
        for (String s : splitted) {
            System.out.println("Compute Line : "+s);
            integerList.add(Integer.parseInt(s));
        }
        return integerList;
    }

    // and the main function to call it all
public static void main(String[] args) {
    new ReadAndParse();
}
}

解析您的文件后得到的一些示例输出:

 variable : L value : [30]
 variable : S value : [1]
 variable : T value : [38]
 variable : b value : [1, 1, 1, 1, 1]
 variable : c value : [1399, 1563, 1303, 1303, 2019]
 variable : v value : [8213, 9319, 10187, 12144, 8206]
 variable : w value : [7027, 9652, 9956, 13973, 6661, 14751]
于 2013-09-19T12:24:10.407 回答
0

我想我得到了一些东西。

编辑:

我改变了我的方法

您需要导入;

import java.io.BufferedReader;

然后

BufferedReader reader = new BufferedReader

int[] arr = new int[3];
int L;
int T;
int S;
for (int i = 0 ;i<5; i++){ //brings you to fifth line

 line = reader.readLine();
}
L = line.split(" ")[0]trim();
T = line.split(" ")[1]trim();
S = line.split(" ")[2]trim();

arr[0] = (L);
arr[1] = (T);    
arr[2] = (S);    
于 2013-09-19T12:46:40.733 回答