>source

입력 텍스트 파일의 청크를 취하는 프로그램을 작성하고 사용자 입력 패턴에 따라 주위를 이동하려고합니다. 텍스트 파일에서 작업 할 텍스트 파일의 자체 인덱스가 주어지면 스레드 은 동기화되거나 동시에 동기화되어야합니다. 그런 다음 지정된 청크에 문자를 버퍼 char 배열의 적절한 위치에 삽입하는 것이 의미합니다.

그러나 code를 실행할 때마다 첫 번째 청크 (적절한 패턴에서 재 배열 된 모든 청크 대신) 만 char 배열에서 끝납니다. Swapper 클래스에 전달 된 값을 두 배로 확인하고 오프셋과 간격이 올바른지 확인했습니다. 여기 (최소화 된) code가 있습니다.

textswap.java

public class TextSwap {
    private static String readFile(String filename, int chunkSize) throws Exception {
        String line;
        StringBuilder buffer= new StringBuilder();
        File file= new File(filename);
        BufferedReader br= new BufferedReader(new FileReader(file));
        while ((line= br.readLine()) != null){
            buffer.append(line);
        }
        br.close();
        return buffer.toString();
    }
    private static char[] runSwapper(String content, int chunkSize, int numChunks) {
        Interval[] intervals= new Interval[5];
        intervals[0]= new Interval(0,4);
        intervals[1]= new Interval(4,8);
        intervals[2]= new Interval(8,12);
        intervals[3]= new Interval(12,16);
        intervals[4]= new Interval(16,20);
        char[] buffer= new char[content.length()];
        Thread[] threads= new Thread[numChunks];
        for(int i= 0; i < numChunks; i++) {
            Interval current= intervals[i];
            threads[i]= new Thread(new Swapper(current, content, buffer, i * chunkSize));
            threads[i].start();
        }
        for(int i= 0; i < numChunks; i++) {
            try {
                threads[i].join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return buffer;
    }
    private static void writeToFile(String contents, int chunkSize, int numChunks) throws Exception {
        char[] buff= runSwapper(contents, chunkSize, contents.length() /chunkSize);
        System.out.println(buff);
        PrintWriter writer= new PrintWriter("src/proj/output.txt", "UTF-8");
        writer.print(buff);
        writer.close();
    }
    public static int getNumber(char val) {
        return Character.getNumericValue(val) -9;
    }
    public static void main(String[] args) {
        if (args.length != 2) {
            System.out.println("Usage: java TextSwap <chunk size> <filename>");
            return;
        }
        String contents= "";
        int chunkSize= Integer.parseInt(args[0]);
        try {
            contents= readFile(args[1],chunkSize);
            writeToFile(contents, chunkSize, contents.length() /chunkSize);
        } catch (Exception e) {
            System.out.println("Error with IO: " + e.getMessage());
            return;
        }
    }
}

interval.java

public class Interval {
    private int x;
    private int y;
    public Interval(int x, int y) {
        this.x= x;
        this.y= y;
    }
    public int getX() {
        return this.x;
    }
    public int getY() {
         return this.y;
    }
    public String toString() {
        return "(" + this.x + ", " + this.y + ")";
    }
}

swapper.java

public class Swapper implements Runnable {
    private int offset;
    private Interval interval;
    private String content;
    private char[] buffer;
    public Swapper(Interval interval, String content, char[] buffer, int offset) {
        this.offset= offset;
        this.interval= interval;
        this.content= content;
        this.buffer= buffer;
    }
    @Override
    public void run() {
        //TODO: Implement me!
        int x= interval.getX();
        int y= interval.getY();
        for(int i= x; i < (y -x); i++) {
            buffer[offset + (i -x)]= content.charAt(i);
        }
    }
}

텍스트 파일의 내용 :aaaabbbbcccddddeeee

하드 code 패턴 :

​​Bcade

명령 + 인수 :

​​자바 TextSwap 4 Letters.txt(4는 4 일입니다chunksize.)

원하는 출력 :bbbbccccaaaaddddeeee

실제 출력 :AAAA

for (int i= x; i < (y -x); i++) { 에 중단점을 설정하고 각 스레드에 대해 i < y-x 값을 확인합니다. (아니면 그냥 종이로 계산해서 첫 번째 반복만 보면 됨)

tgdavies2021-09-20 09:45:11

@tgdavies 아, 그래서 나는 바보입니다. 감사합니다.

HalfMillennium2021-09-20 09:45:11

나는 실수가 오프셋과 절대 인덱스를 혼동하는 방식으로 혼합한 것이라고 생각합니다. 그리고 단위 테스트를 작성하지 않습니다. Swapper에 대한 단위 테스트는 문제를 매우 빠르게 찾아냈을 것입니다.

tgdavies2021-09-20 09:45:11
  • 이전 sql : 다른 열에 동일한 값이있는 파티션의 각 선행 행에 대해 하나의 행을 가져 오는 행
  • 다음 Typescript 유형 시스템을 끊었습니까?