Java:用Integer替换字符串

时间:2016-12-09 18:26:22

标签: java string replace hashmap integer

我是新来的,所以我希望我能够正确地描述这个问题,并且当我更喜欢Java和其他东西时帮助别人。

但是这就是为什么我在这里......我需要转换给定的文本文件,所以我可以在名为“SUBDUE”的程序中使用它。

文件中给定图形的格式如下所示:

v 2_i_6 startevent

v 2_i_7 endevent

v 2_i_1 task
v 2_i_2 task
v 2_i_3 task
v 2_i_4 task
v 2_i_5 task

v 2_i_15 and
v 2_i_17 and
v 2_i_14 xor
v 2_i_16 xor
v 2_i_18 xor
v 2_i_19 xor

但对于该程序,此文件中的图形需要如下所示:

v 1 startevent

v 2 endevent

v 3 task
v 4 task
v 5 task
v 6 task
v 7 task

v 8 and
v 9 and
v 10 xor
v 11 xor
v 12 xor
v 13 xor

起初我以为我会手工做。但我意识到它们有2000个。所以我尝试用Java编写程序。

所以这就是我得到的:

public class Input {

HashMap<String, Integer> replacements = new HashMap<String, Integer>();

public void readFile() throws IOException {

    FileReader fr = new FileReader(
            "file.txt");
    BufferedReader br = new BufferedReader(fr);
    String line = null;
    StringBuilder sb = new StringBuilder();
    int i = 0;

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

        if (line.startsWith("%")) {//every graph starts with % and a number so i know which graph is currently in progress
            i = 0;
        }
        if (line.startsWith("v")) {
            i++;
            replacements.put(line.split(" ")[1], i);
        }
    }
    fr.close();

    fr = new FileReader("file.txt");
    br = new BufferedReader(fr);
    while ((line = br.readLine()) != null) {
        for (Entry<String, Integer> e : replacements.entrySet()) {
            line = line.replaceAll(e.getKey().toString(), e.getValue().toString());
            line.toString();
        }
        sb.append(line);
        System.out.println(line);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
    fr.close();

    FileWriter fw = new FileWriter(
            new File("file.txt"));
    fw.write(sb.toString());
    fw.close();
}

当我启动程序时,它大部分正确转换,但有时会发生这种情况:

v 1 startevent

v 2 endevent

v 3 task
v 4 task
v 5 task
v 6 task
v 7 task

v 35 and
v 37 and
v 34 xor
v 36 xor
v 38 xor
v 39 xor

我开始调试,但放弃了,因为我需要浏览整个地图,直到找到正确的密钥..所以我在第一个i++中删除了while-loop,所以{{1 }}始终是i。得到这样的东西:

0

但我不知道为什么它只取代了第一个两位数的数字。

我希望有人给我一个提示,或者更好的选择来替换我想要的字符串。

感谢您的回答。

因为这里要求的是我文件的前三个图表。抱歉,不方便,

v 0 startevent

v 0 endevent

v 0 task
v 0 task
v 0 task
v 0 task
v 0 task

v 05 and
v 07 and
v 04 xor
v 06 xor
v 08 xor
v 09 xor

3 个答案:

答案 0 :(得分:1)

这可以作为起点。拆分字符串似乎是一种更好的方法。

public static void main(String[] args) {
    // TODO code application logic here
    String [] input = {"v 2_i_6 startevent", "", "v 2_i_7 endevent"};

    for(int i = 0; i < input.length; i++)
    {
        System.out.println(myStringFormatter(input[i]));
    }
}

static String myStringFormatter(String input)
{
    if(input.length() > 0)
    {
        String[] processing = input.split(" ");//Splits the string  into 3 parts v, 2_i_6, and startevent
        String[] processing2 = processing[1].split("_");//Splits 2_i_6 into 3 parts 2, i, and 6

        return processing[0] + " " + processing2[2] + " " + processing[2]; //Takes the first part of the first split, the third part of the second split, and the third part of the first split and put them back together separated by a space
    }

    return "";//If it gets an empty string, its going to return an empty string
}
  

输出

enter image description here

答案 1 :(得分:1)

我将此部分添加到您的代码中

ArrayList <String> strings = new ArrayList<>();
int counter=0;
while ((line = br.readLine()) != null) {
    if (line.startsWith("%")) {//every graph starts with % and a number so i know which graph is currently in progress
            i = 0;
        }
        if (line.startsWith("v")) {
            i++;
            counter++;
            strings.add(line.split(" ")[0]+" "+counter+" "+line.split(" ")[2]);
            replacements.put(line.split(" ")[1], counter);
        }
    }
fr.close();
strings.forEach(System.out::println);

正如你所看到的那样,我添加一个名为counter的{​​{1}}和一个数组列表,就在你的替换哈希映射之前,我确实收集了字符串的第一部分和最后一部分,而不是像你一样收集中间部分并在stirngs

中打印

答案 2 :(得分:0)

替换所有逻辑都不正确。

3_i_1映射到3

它也匹配3_i_15的replaceAll情况,这就是为什么你看它被替换为34,35,36

我的file.txt中有两张图,我看到第二张图中的问题清单。一种解决方法是在replace all子句中附加“”空格以区分3_i_1与3_i_15

由于您正在遍历hashmap的条目,看起来像2_i_15,8出现在2_i_1,3之前,而3_i_1,3出现在3_i_15,8之前。