2016-12-09 1 views
2

저는 여기에서 새로 왔으므로이 문제를 올바르게 설명 할 수있을뿐만 아니라 Java와 같은 기능을 많이 할 때 다른 사람들을 도울 수 있기를 바랍니다.Java : 문자열을 정수로 바꾸기

하지만 내가 여기있는 이유는 ... 주어진 텍스트 파일을 변환해야하므로 "SUBDUE"라는 프로그램에서 사용할 수 있습니다.

파일에 주어진 그래프의 형식은 다음과 같습니다

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 

먼저 I에서 :

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 

그러나 프로그램에 대한

는이 파일의 그래프는 다음과 같이해야합니다 나는 그것을 손으로 할 것이라고 생각했다. 하지만 2000 명이 있다는 것을 깨달았습니다. 그래서 Java로 프로그램을 작성하려고했습니다. 때문에, 나는 디버깅을 시작

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 

하지만 포기 : 나는이 프로그램을 시작할 때

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(); 
} 

, 그것은 대부분 바로 변환,하지만 때로는 이런 : 그래서 여기

는 내가 가진 무엇 오른쪽 키가 발견 될 때까지 전체 맵을 살펴볼 필요가있었습니다. 그래서 에서 i++을 삭제했기 때문에, 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 

을하지만 그것은 단지 두 자리 수의 사람들의 첫 번째 숫자를 대체 이유를 모르겠어요.

누군가 나에게 힌트를 주거나, 내가 원하는대로이 문자열을 바꾸는 더 나은 옵션이 있기를 바랍니다.

답장을 보내 주셔서 감사합니다.

내 파일의 처음 세 그래프가 여기에 요청되기 때문에. 불편을 드려 죄송합니다.

%1./konvertiermich/andere/Paper-Leben-Modeliranje_delovnih_procesov/obdelava_narocil.epml.pl 

v 1_i_2 startevent 

v 1_i_17 endevent 
v 1_i_23 endevent 
v 1_i_26 endevent 

v 1_i_4 task 
v 1_i_5 task 
v 1_i_9 task 
v 1_i_11 task 
v 1_i_20 task 
v 1_i_21 task 
v 1_i_25 task 

v 1_i_6 xor 
v 1_i_10 xor 
v 1_i_13 xor 
v 1_i_14 xor 
v 1_i_15 xor 
v 1_i_19 xor 
v 1_i_22 xor 

d 1_i_2 1_i_4 arc 
d 1_i_5 1_i_6 arc 
d 1_i_9 1_i_10 arc 
d 1_i_10 1_i_14 arc 
d 1_i_10 1_i_15 arc 
d 1_i_11 1_i_13 arc 
d 1_i_13 1_i_14 arc 
d 1_i_13 1_i_15 arc 
d 1_i_20 1_i_17 arc 
d 1_i_19 1_i_21 arc 
d 1_i_21 1_i_22 arc 
d 1_i_22 1_i_23 arc 
d 1_i_25 1_i_26 arc 
d 1_i_4 1_i_5 arc 
d 1_i_6 1_i_9 arc 
d 1_i_6 1_i_19 arc 
d 1_i_10 1_i_11 arc 
d 1_i_15 1_i_20 arc 
d 1_i_14 1_i_19 arc 
d 1_i_22 1_i_25 arc 

%2./konvertiermich/andere/Web-Wikipedia.cz/wikipedia.cz.epml.pl 

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 

d 2_i_1 2_i_14 arc 
d 2_i_3 2_i_18 arc 
d 2_i_6 2_i_3 arc 
d 2_i_14 2_i_7 arc 
d 2_i_15 2_i_5 arc 
d 2_i_16 2_i_1 arc 
d 2_i_17 2_i_4 arc 
d 2_i_17 2_i_2 arc 
d 2_i_19 2_i_17 arc 
d 2_i_2 2_i_15 arc 
d 2_i_4 2_i_15 arc 
d 2_i_18 2_i_19 arc 
d 2_i_5 2_i_16 arc 
d 2_i_14 2_i_19 arc 
d 2_i_18 2_i_16 arc 

%3./konvertiermich/deutsch/BA-Blau-Customer_Relationship_Management_gestützte_Prozesse_am_Beispiel_des_Unternehmens_Alere/39-Angebotsprozess.pl 

v 3_i_1 startevent 

v 3_i_19 endevent 

v 3_i_2 task 
v 3_i_6 task 
v 3_i_7 task 
v 3_i_10 task 
v 3_i_13 task 
v 3_i_15 task 
v 3_i_18 task 

v 3_i_3 xor 
v 3_i_8 xor 
v 3_i_12 xor 
v 3_i_17 xor 

d 3_i_1 3_i_2 arc 
d 3_i_2 3_i_3 arc 
d 3_i_6 3_i_8 arc 
d 3_i_7 3_i_8 arc 
d 3_i_12 3_i_13 arc 
d 3_i_17 3_i_18 arc 
d 3_i_18 3_i_19 arc 
d 3_i_12 3_i_17 arc 
d 3_i_3 3_i_6 arc 
d 3_i_3 3_i_7 arc 
d 3_i_8 3_i_10 arc 
d 3_i_10 3_i_12 arc 
d 3_i_13 3_i_15 arc 
d 3_i_15 3_i_17 arc 
+0

당신은'if (line.startsWith ("%")) {// 모든 그래프가 %와 숫자로 시작됩니다 그래서 어떤 그래프가 현재 진행중인지 알 수 있습니다. 그러나 당신은'% '를 당신의 입력의 아무 곳에 나 가지고 있지 않습니다. –

+0

문제는 2000 년 그래프입니다. 그래프 3 f. '3_i_', 그래프 4'4_i_' 등이 있습니다. 또한 번호는 1에서부터 몇 명까지 순서가 맞아야합니다. 나는 편집자와 함께 노력했지만 너무 오래 걸릴 것이다. – NicoE

+1

중간 열이 카운터 인 것처럼 보이기 때문에 더 완벽한 예제를 포함 할 수 있습니까? 나는 그 파일을 한 번 이상 읽을 필요가 없다고 생각한다. –

답변

0

모든 논리가 잘못되었습니다. 3

3_i_1지도는 또한 34, 35, 내 file.txt를 두 그래프를했고, 36

내가 볼로 교체되는 것을 볼 이유입니다 3_i_15에 대한 완전히 대체 케이스를 일치 문제는 두 번째 그래프와 함께 나타납니다. 한 가지 해결 방법은 replace all 절에 "3_i_1"과 "3_i_15"를 구별하는 공간을 추가하는 것입니다.

해시 맵의 항목을 반복 처리하므로 2_i_15와 같은 모양이됩니다. 2_i_1,3보다 8이 먼저 나오므로 3_i_1,3이 나타납니다. 3_i_15,8 전에.

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

난 당신이 볼 수 있듯이 나는 counterstirngs 단지라는 이름의 ArrayList를 ans와 추가 코드

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); 

에이 부분을 추가 너의 보충 해시지도 I di의 앞에 d와 같이 중간 부분을 취하는 대신 문자열의 첫 번째와 마지막 부분을 수집합니다. strings.forEach(System.out::println);