2014-04-27 2 views
1

저는이 문제에 대해 정말로 부끄러워합니다. 나는 그것을하는 방법을 이해할 수 없기 때문에. 나는 텍스트 파일을 가지고있다. 이 텍스트 파일에는 100 만 개의 숫자가 있습니다. 이것들은 0에서 999 사이이며 모든 줄에는 숫자가 들어 있습니다. 이 숫자를 (\ n)으로 구분해야합니다. 즉, 모든 줄에는 하나의 정수가 포함됩니다. 그런 다음 나는 이것을 분류해야합니다. 정렬 후 사용자로부터 2 개의 입력을받습니다. 그럼 첫 번째 텍스트 파일에서 이러한 입력 사이에 새로운 텍스트 파일을 찾아 숫자를 써야합니다.텍스트 파일 읽기 (구분, 정렬, ArrayList로 숫자 사이에서 찾기)

나는 대부분의 사람들이 "우리는 바보가 아니다. 당신은 아무것도 모른다.이 사이트는 이런 모양이 아니다"라고 말할 것입니다. 맞아,하지만이 일을해야 해. 나는 이것을 어떻게 할 수 있는지 알고 싶다. 어떤 방법이나 전략이 필요합니까? 왜냐하면 나는 여기에서 비슷한 것들을 발견했기 때문에 나는 내 일과 관련해서 이러한 사실을 모릅니다.

숫자는 계산 정렬 알고리즘을 사용하여 정렬

답변

2

파일을 읽으려면이 도구를 사용하면 작업이 간단해질 것입니다. 정렬
http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html

는,이 클래스에서 보면, 그것은 sort 방법이있다.
이 int로 (파일에서 읽기) 또는 정수 값이 클래스를 사용하여 문자열 값을 변환
http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html

, 그것은 parseInt 방법이있다.
http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html

+0

나는 당신의 근원을 읽고 있습니다. 고마워 많이 도움이 될 것입니다. 다시 한번 감사드립니다. – Calaquessir

-1

: 당신은 0에서 그래서 999, 제한된 범위의 번호를 가지고, 각 번호가 입력 파일에서 발생 횟수를 셀 수 :

int[] count = new int[1000]; 
//depending of scope, maybe you need to fill array with zeroes 

... 
int number = ...;//read number from file; 
count[number]++; 

을 지금을, 귀하의 작업이 출력 모두에 필요하지 않지만,

for (int i = 0; i < 1000; ++i) { 
    for (int j = 0; j < count[i]; ++j) { 
     System.out.println(i); 
    } 
} 

난 그냥 확실히 생각이 분명하게 쓴 : 출력 순서에는 정렬, 당신은이 같은 두 개의 루프가 필요합니다. 자,이 두 숫자를 읽었을 때를 상상해 봅시다.

int counter = 0; 
for (int i = 0; i < 1000; ++i) { 
    for (int j = 0; j < count[i]; ++j) { 
     if ((counter >= start) && (counter < finish)) {//or maybe <=, depending on what exactly do you need 
      System.out.println(i); 
     } 
     counter++; 
     if (counter > finish) { //we finished, further iterations are waste of CPU time 
      break(2); 
     } 
    } 
} 

이 방법은 최적의,하지만 이해하고 구현하기가 쉽지 않다 :

int start, finish = 0; //value read from input 

우리는 다음과 같이 위의 루프를 수정거야. 보다 빠른 솔루션을 원하면 내부 루프를 없애고 논리로 대체하여 count[i]counter에 즉시 추가하고 출력을 시작할 필요가있는 순간을 감지 할 수 있습니다.

+0

Downvoters mind commenting? –

+0

나는 왜 당신이 -1을 가지고 있는지 모른다. 나는이 알고리즘을 내 작업에 사용할 수있다. 귀하의 관심에 너무 감사드립니다. – Calaquessir

+0

@Calaquessir 기꺼이 도와 드리겠습니다.) –

0

여기 자바 8을 사용하여 간단한 예이다 :

public static void main(final String[] args) throws IOException { 
    final Pair input = readInput(); 
    final Path sourceFile = Paths.get("path", "to", "input", "file"); 
    final Path destFile = Paths.get("path", "to", "output", "file"); 
    final IntStream parsed = Files.lines(sourceFile). 
      mapToInt(Integer::parseInt). 
      filter(i -> i >= input.getLow() && i <= input.getHigh()). 
      parallel(). 
      sorted(); 
    try (final PrintWriter outputFile = new PrintWriter(Files.newBufferedWriter(destFile, StandardCharsets.UTF_8))) { 
     parsed.forEach(outputFile::println); 
    } 
} 

private static Pair readInput() { 
    final Console console = System.console(); 
    final String low = console.readLine("Please enter the start number (inclusive): "); 
    final String high = console.readLine("Please enter the end number (inclusive): "); 
    return new Pair(Integer.parseInt(low), Integer.parseInt(high)); 
} 

private static final class Pair { 
    private final int low; 
    private final int high; 

    private Pair(int low, int high) { 
     this.low = low; 
     this.high = high; 
    } 

    public int getHigh() { 
     return high; 
    } 

    public int getLow() { 
     return low; 
    } 
} 

readInput() 방법은 사용자 입력을 보유 클래스 Pair으로 높거나 낮은 값을 읽어 Console를 이용한다.

main있어서, readInput() 다음 입력 파일에서 라인을 판독 호출 low 미만 및 초과 high 평행 정렬 얻어진 출력되는 숫자를 필터링한다.

파이프 라인 설정이 끝나면 forEach을 호출하고 그 값을 출력 파일에 씁니다.

+0

관심을 가져 주셔서 감사합니다. 그러나 그것은 분명하지 않습니다. – Calaquessir

+1

@Calaquessir 그럼 당신은 할 일이 있다고 생각합니다. –

+0

맞습니다. 다시 한번 감사드립니다. – Calaquessir

관련 문제