2016-08-30 2 views
0

k 값을 file1.txt와 file2.txt의 값을 output.txt로 병합하는 병합 함수를 작성하려고합니다.Java에서 입력 파일의 k 값을 병합

예를 들어 내 file1.txt에 3 1 8 5가 포함되어 있고 file2.txt에 7 2 6 4가 포함되어있는 경우 내용이 3 7 1 2 6 8 4 5 인 출력 파일 (2k) . 그래서이 경우에 k = 1 일 때, k = 1 값을 file1.txt와 file2.txt에서 병합합니다. 이 작업은 k = 1,2,4,8, ...

예상대로 작동하지 않습니다. 주요 문제는 첫 번째 while 루프에 있다고 생각합니다. 그 이상의 내용을 읽어야하고이를 해결하는 방법을 모르겠습니다./그래서 주요 질문은 입력 파일을 모두 올바르게 읽도록 조건을 설정하는 것입니다. 끝내고 쌍을 출력하여 병합하시오.

더 구체적으로 말하자면, 직선 머지 방법을 사용하여 입력 순서 3 7 1 2 8 6 5 4를 최종 정렬 된 출력 1 2 3 4 5 6 7 8로 정렬하려고합니다. 지금은 모든 문제가 도움이되기를 바랍니다.

너보다!

int i = 1; 
int j = 1; 
int k = 1; 
BufferedWriter sorted_file_writer = new BufferedWriter(new FileWriter("output.txt",true));      
BufferedReader wfr_1 = new BufferedReader(new FileReader("file1.txt")); 
BufferedReader wfr_2 = new BufferedReader(new FileReader("file2.txt")); 

int v1; 
int v2; 

String l1; 
String l2; 

while((i<=k) && (j<=k))    
{ 
    l1=wfr_1.readLine(); 
    l2=wfr_2.readLine(); 
    v1 = Integer.parseInt(l1); 
    v2 = Integer.parseInt(l2); 

    if(v1 < v2) 
    { 
     sorted_file_writer.write(Integer.toString(v1)); 
     sorted_file_writer.write(System.getProperty("line.separator")); 
     i++;      
    } 

    else 
    { 
     sorted_file_writer.write(Integer.toString(v2)); 
     sorted_file_writer.write(System.getProperty("line.separator")); 
     j++; 
    } 
} 

while(i <= k) 
{ 
    l1=wfr_1.readLine(); 
    v1 = Integer.parseInt(l1); 

    sorted_file_writer.write(Integer.toString(v1)); 
    sorted_file_writer.write(System.getProperty("line.separator")); 
    i++; 
} 

while(j <= k) 
{ 
    l2=wfr_2.readLine(); 
    v2 = Integer.parseInt(l2); 

    sorted_file_writer.write(Integer.toString(v2)); 
    sorted_file_writer.write(System.getProperty("line.separator"));     
    j++; 
} 
+0

당신이 * K *의 높은 값에 대한 가공 한 예를 준 경우 크게 도움이 될 것이다. –

+0

I 단지 어떤 작업 용액이 아직 없으므로 흐름처럼 보여야하는 방법을 제공 할 수/ 입력 : 37,128,654 1 분포 (K = 1) FILE1 : 3 1 8 5 파일 2 : 7; 2 6 4 제 병합 후 37 68 파일 2 : 12 54 제 병합 후 : 1237, 4568 번째 분포; 12; 68 45 초 배포 (K = 2) FILE1 37 (k = 4) file1 : 1237 file2 : 4568 세 번째 병합 후 : 12345678 최종 출력 시퀀스 : 12345678 유일한 문제는이 병합 부분이 k = 1,2 및 4입니다. 병합이 작동하면 모든 것이 작동합니다. :) 이 경우의 입력 파일 길이가 8이므로 최대 k = 8/2 = 4임을 기억하십시오. – henrich

답변

0

읽는 두 값을 조절 한 후에 그 중 하나를 출력 한 다음 다른 하나를 버리면 문제가 발생합니다. 작은 값을 출력하는 것이 아니라 올바른 순서로 두 값을 출력해야합니다.

당신이 그 다음, K의 더 큰 값에 대한 작업을 지금까지 가장 쉬운 방법은 출력 후 그들을 두 파일에서 모든 K 값을 읽어 Arrays.sort() 또는 Collections.sort() 그들을 정렬하는 데 사용하고하는 것입니다하려는 경우 .

코드를 작성하지 않고도 충분한 단서를 제공합니다.

+0

나는 그것을 버리고 있음을 알고있다. 질문은 BufferedReader를 버리지 않는 방법이다. 이 알고리즘은 k가 클 때도 작동해야합니다. thunfischtoast 대답에 대한 내 의견을 참조하십시오! – henrich

+0

@henrich * k *의 큰 값을 돕기 위해 추가 행을 추가했습니다. 더 큰 값으로 작업하려면 내장 된 정렬 방법을 사용하는 것이 더 좋은 방법입니다. –

+0

여기에있는 것은 RAM을 거치지 않고 정렬해야한다는 것입니다. 내 파일이 이것보다 훨씬 크기 때문에 배열에 저장하면 여러 개의 "메모리 부족"예외가 발생할 수 있습니다. 내부 정렬 알고리즘을 사용하는 솔루션은 좋지만 마음에 들지 않습니다. 예를 들어 1GB의 RAM 만 있으면이 알고리즘이 작동해야한다고 가정 해 보겠습니다. – henrich

0

첫 번째 루프 반복마다 두 파일의 값을 읽지 만 하나의 값만 사용하는 것이 문제입니다. 출력 파일에 두 값을 모두 써야합니다.

0

파일의 행 수가 정확히 같으면 반복 변수 ij은 피해야합니다. 루프의 내용은 다음과 같아야합니다.

l1=wfr_1.readLine(); 
l2=wfr_2.readLine(); 
v1 = Integer.parseInt(l1); 
v2 = Integer.parseInt(l2); 

if(v1 < v2) 
{ 
    sorted_file_writer.write(Integer.toString(v1)); 
    sorted_file_writer.write(System.getProperty("line.separator")); 
    sorted_file_writer.write(Integer.toString(v2));  
    sorted_file_writer.write(System.getProperty("line.separator"));    
} 

else 
{ 
    sorted_file_writer.write(Integer.toString(v2)); 
    sorted_file_writer.write(System.getProperty("line.separator")); 
    sorted_file_writer.write(Integer.toString(v1)); 
    sorted_file_writer.write(System.getProperty("line.separator")); 
} 
+0

더 많은 'sorted_file_writer.write (System.getProperty (" line.separator ")); ' – talex

1

두 값을 읽고 하나의 값만 쓰고 있습니다. 왜 값을 쓸 때 카운터를 사용하고 있습니까?

더 간단하게 만들 수 있을까요? 이것에 대해 :

void write(v1, v2) 
{ 
    if(v1 < v2) 
    { 
     sorted_file_writer.write(Integer.toString(v1)); 
     sorted_file_writer.write(System.getProperty("line.separator")); 
sorted_file_writer.write(Integer.toString(v2)); 
     sorted_file_writer.write(System.getProperty("line.separator"));    
    } 

    else 
    { 
     sorted_file_writer.write(Integer.toString(v2)); 
     sorted_file_writer.write(System.getProperty("line.separator")); 
sorted_file_writer.write(Integer.toString(v1)); 
     sorted_file_writer.write(System.getProperty("line.separator")); 
    } 
} 

void main() 
{ 
int k = 10; //for example 

while(i <= k) 
{ 
    l1=wfr_1.readLine(); 
    v1 = Integer.parseInt(l1); 
    l2=wfr_2.readLine(); 
    v2 = Integer.parseInt(l2); 

    write(v1, v2); 
    i++; 
} 

} 
0

이것은 배열과 완벽하게 작동하는 방법입니다. 배열을 전혀 사용하지 않고 행운을 사용하여 파일에 대해 동일한 기능을 구현하려고합니다. 병합 알고리즘의 파일 버전으로 다시 작성하려고 할 때 작동하지 않습니다 (내 initital 질문 참조).

이전 게시물에 따르면 k을 생각해 볼 수 있습니다. 이제는 a.length와 b.length가 첫 번째 반복에서 k = 1이고 k = 2이고 마지막 k = 4에서와 같이 생각할 수 있습니다. 따라서 8 개의 요소의 최종 정렬 된 시퀀스를 생성합니다.이것에 대해 더 궁금한 점이 있으면 알려주십시오.

감사합니다.

public class MergeArrays 
{ 
    public static void main(String[] args) 
    {    
     int a[] = {3}; // or {3,7} or {1,2,3,7} 
     int b[] = {7}; // or {1,2} or {4,5,6,8} 

     merge(a, b);         
    } 

    private static void merge(int[] a, int[] b) 
    { 
     int i = 0; 
     int j = 0;  

     while(i<a.length && j<b.length) 
     { 
      if (a[i] < b[j]) 
      { 
       System.out.println(a[i++]);    
      } 

      else 
      { 
       System.out.println(b[j++]);    
      }   
     } 

     /* Print the rest of the remaining array */ 
     while (i < a.length) 
     { 
      System.out.println(a[i++]);   
     } 

     while (j < b.length) 
     { 
      System.out.println(b[j++]);   
     }  
    } 
} 
0
BufferedWriter sorted_file_writer = new BufferedWriter(new FileWriter("output.txt",true));      
    BufferedReader wfr_1 = new BufferedReader(new FileReader("file2.txt")); 
    BufferedReader wfr_2 = new BufferedReader(new FileReader("file1.txt")); 
    int v1, v2; 
    String l1, l2; 
    while(true){ 
     l1=wfr_1.readLine(); 
     l2=wfr_2.readLine(); 
     if(l1 == null || l2 == null) 
      break; 
     v1 = Integer.parseInt(l1); 
     v2 = Integer.parseInt(l2);   
     if(v1 < v2) 
     { 
      sorted_file_writer.write(l1+System.getProperty("line.separator")); 
      sorted_file_writer.flush(); 
      sorted_file_writer.write(l2+System.getProperty("line.separator")); 
      sorted_file_writer.flush(); 
     } 
     else 
     { 
      sorted_file_writer.write(l2+System.getProperty("line.separator")); 
      sorted_file_writer.flush(); 
      sorted_file_writer.write(l1+System.getProperty("line.separator")); 
      sorted_file_writer.flush(); 
     } 
    } 

    while(l1!=null) 
    { 
     sorted_file_writer.write(l1+System.getProperty("line.separator")); 
     sorted_file_writer.flush(); 
     l1=wfr_1.readLine(); 
    } 

    while(l2!=null) 
    { 
     sorted_file_writer.write(l2+System.getProperty("line.separator")); 
     sorted_file_writer.flush(); 
     l2=wfr_2.readLine(); 
    } 
+0

이 솔루션은 많은 단위 케이스 실행입니다. 질문이 있으시면 알려주십시오. – Hardik

+0

쿼리가 전혀 없습니다. 나는 그 문제를 해결할 수 있었다. – henrich