Как отсортировать строки в кавычках из текстового файла в Java - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь прочитать список цитируемых строк, например,

"GJKFMN","OUYTV","VFRN","APLUI","DCFUYT","DXSER","JHGF","PIUYT","XSQ" 

, из текстового файла и отсортировать слова в алфавитном порядке. Я также хочу подсчитать каждое из этих слов в форме, скажем, A=1, B=2,... и суммировать алфавиты каждого слова.

Я пробовал этот код ниже для сортировки, но он не сортирует его для меня:

public static void main(String[] args){
    String filePath = null;
    if (args[0] == null || args[0].isEmpty()) {
        System.out.println("Please Enter the Names File Path Enclosed in Double Quotes");
    }
    else {
        filePath = args[0];
    }
    List<String> bufferList = loadDataUsingBufferReader(filePath);
    List<String> listWithoutQuotes = removeQuotes(bufferList);
    listWithoutQuotes.parallelStream().map(String::toUpperCase).sorted().forEach(System.out::println);
}
public static List<String> removeQuotes(List<String> listWithQoutes) {
    listWithQoutes = listWithQoutes.stream().map(s -> s.replaceAll("\"", "")).collect(Collectors.toList());
    return listWithQoutes;
}
public static List<String> loadDataUsingBufferReader(String filePath) {
    final Charset ENCODING = StandardCharsets.UTF_8;
    List<String> lines = new LinkedList<>();
    try {
        final BufferedReader in = new BufferedReader(
                new InputStreamReader(new FileInputStream(filePath), ENCODING));
        String line;
        while ((line = in.readLine()) != null) {
            lines.add(line);
        }
        in.close();
    } catch (final IOException e) {
        e.printStackTrace();
    }
    return lines;
}

В коде я читаю путь к файлу из командной строки. Когда я жестко кодирую ввод, он сортирует его, но когда я читаю из файла, это не так. Производительность является ключевым фактором, так как размер файла может достигать миллиона слов.

Заранее благодарим за помощь ...

Ответы [ 2 ]

1 голос
/ 21 июня 2020

После того, как вы удалили двойные кавычки из текстового файла, я бы go выполнил следующие шаги:

Чтение всего файла как одной строки:

Path path = FileSystems.getDefault().getPath(directory, filename);
String fileContent = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);

Разделить содержимое на слова, поскольку у вас есть стандартный разделитель-запятая:

String[] words = fileContent.split(",");

Затем отсортируйте его с помощью встроенного метода класса Arrays:

Arrays.sort(words);

Для вычисления оценки каждого слова: десятичное значение ascii с заглавной буквы "A" 65, поэтому, если вы вычтите 64 из десятичного значения ascii каждой буквы, вы найдете счет. Например:

String abc = "ABC";
int sum = 0;

for (int i = 0; i < abc.length(); ++i){
    sum += (int) abc.charAt(i) - 64;
} 

Здесь sum значение 6.

1 голос
/ 21 июня 2020

Используя следующие тестовые данные, которые вы можете просто скопировать и вставить в текстовый файл и использовать его как образец файла

"DSRD","KJHT","BFXXX","OUYTP"
"ABCD","XSHTKK","RTZI","HKLOPQ"
"BGTSZ","ASY","LOMCV","DESRAW"
"VMWEE","ERTZU","GSDFX","BHGFD"
"CD","FRTZU","JUHL","RETZ"

Должно работать что-то вроде ниже. Я надеюсь, что названия методов говорят сами за себя и понятно, что происходит на каждом этапе. Я включил несколько операторов println в качестве небольшой помощи по отладке. Вам следует удалить их, если вы работаете с исходными файлами, которые могут быть очень большими.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Example {

    public static void main(String args[]) throws IOException {
        String filePath = null;
        if (args[0] == null || args[0].isEmpty()) {
            System.out.println("Please Enter the Names File Path Enclosed in Double Quotes");
        }
        else {
            filePath = args[0];
        }

        List<String> allLines = readAllLinesFromFile(filePath);
        allLines.forEach(System.out::println);
        System.out.println("**********************");

        List<String> listWithoutQuotes = removeQuotes(allLines);
        listWithoutQuotes.forEach(System.out::println);
        System.out.println("*****************");

        List<String> allWords = getAllWordsFromEachLineSorted(listWithoutQuotes);
        System.out.println(allWords);
        System.out.println("****************");

        List<Integer> scores = calculateStoreForAList(allWords);
        System.out.println(scores);
    }
    static List<String> readAllLinesFromFile(String fileName) throws IOException{
        return Files.readAllLines(Paths.get(fileName));
    }
    public static List<String> removeQuotes(List<String> listWithQoutes) {
        return listWithQoutes.stream()
                .map(s -> s.replaceAll("\"", ""))
                .collect(Collectors.toList());
    }
    public static List<String> getAllWordsFromEachLineSorted(List<String> lines) {
        return lines.stream()
                .map(s -> s.split("\\s*,\\s*"))
                .flatMap(Arrays::stream)
                .sorted()
                .collect(Collectors.toList());
    }

    static int calculateScore(String word){
        return word.chars()
                .map(i -> i-64)
                .sum();
    }
    static List<Integer> calculateStoreForAList(List<String> allWords){
        return allWords.stream()
                .map(str -> calculateScore(str))
                .collect(Collectors.toList());
    }
}

Вы должны увидеть что-то похожее на

"DSRD","KJHT","BFXXX","OUYTP"
"ABCD","XSHTKK","RTZI","HKLOPQ"
"BGTSZ","ASY","LOMCV","DESRAW"
"VMWEE","ERTZU","GSDFX","BHGFD"
"CD","FRTZU","JUHL","RETZ"
**********************
DSRD,KJHT,BFXXX,OUYTP
ABCD,XSHTKK,RTZI,HKLOPQ
BGTSZ,ASY,LOMCV,DESRAW
VMWEE,ERTZU,GSDFX,BHGFD
CD,FRTZU,JUHL,RETZ
*****************
[ABCD, ASY, BFXXX, BGTSZ, BHGFD, CD, DESRAW, DSRD, ERTZU, FRTZU, GSDFX, HKLOPQ, JUHL, KJHT, LOMCV, OUYTP, RETZ, RTZI, VMWEE, XSHTKK]
****************
[10, 45, 80, 74, 27, 7, 70, 45, 90, 91, 60, 79, 51, 49, 65, 97, 69, 73, 68, 93]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...