当前位置: 首页 > 知识库问答 >
问题:

如何用Java读取长文本中的信息

沈飞翔
2023-03-14
#The number of cars that you can put in garage  = 4 
t1n1b2p2t1m1b2a2 
v1j1t1c1b3t1b1a1m1j1b4
#The number of cars that you can put in garage = 4 
Tesla Nissan BMW+ | Porsche+ Tesla Maserati | BMW+ Audi+ | 
Volvo Jaguar Tesla Cadillac | BMW++ Tesla | BMW Audi Maserati Jaguar  | BMW+++ |
#The number of cars that you can put in garage is different
^3
t1b1t1b3
^2
m2a1t1
^4
a4v2p2
#The number of cars that you can put in garage is different
#Number of cars = 3
Tesla BMW Tesla | BMW++ | 
#Number of cars = 2
Maserati+ | Audi Tesla | 
#Number of cars = 4
Audi+++ | Volvo+ Porsche+ | 

共有1个答案

鲁望
2023-03-14

首先是代码。代码后的解释。

import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Garages {
    private static final Map<Character, String> CAR_MAKES = Map.of('a', "Audi",
                                                                   'b', "BMW",
                                                                   'c', "Cadillac",
                                                                   'j', "Jaguar",
                                                                   'm', "Maserati",
                                                                   'n', "Nissan",
                                                                   'p', "Porsche",
                                                                   't', "Tesla",
                                                                   'v', "Volvo");
    private static final Pattern REGEX = Pattern.compile("\\d+$");

    private static String handleLine(String line, int limit) {
        StringBuilder result = new StringBuilder();
        int total = 0;
        char[] letters = line.toCharArray();
        for (int j = 0; j < letters.length; j++) {
            if (j % 2 == 0) {
                // should be a letter
                String make = CAR_MAKES.get(letters[j]);
                result.append(make);
            }
            else {
                // should be a number
                int amount = letters[j] - '0';
                for (int k = 1; k < amount; k++) {
                    result.append('+');
                }
                result.append(' ');
                total += amount;
                if (total >= limit) {
                    result.append("| ");
                    total = 0;
                }
            }
        }
        return result.toString();
    }

    private static String handleLines(String[] lines) {
        StringBuilder result = new StringBuilder();
        result.append(lines[0]);
        result.append(System.lineSeparator());
        Matcher matcher = REGEX.matcher(lines[0]);
        int limit = 0;
        boolean hasLimit = matcher.find();
        if (hasLimit) {
            limit = Integer.parseInt(matcher.group());
        }
        for (int i = 1; i < lines.length; i++) {
            if (hasLimit) {
                result.append(handleLine(lines[i], limit));
            }
            else {
                if (i % 2 == 1) {
                    // amount line
                    limit = Integer.parseInt(lines[i].substring(1));
                    result.append("#Number of cars = " + limit);
                }
                else {
                    result.append(handleLine(lines[i], limit));
                }
            }
            result.append(System.lineSeparator());
        }
        return result.toString();
    }

    private static String handleInput(String input) {
        return handleLines(input.split("\n"));
    }

    public static void main(String[] args) {
        String first = """
#The number of cars that you can put in garage  = 4
t1n1b2p2t1m1b2a2
v1j1t1c1b3t1b1a1m1j1b4
                """;
        System.out.println(handleInput(first));
        String second = """
#The number of cars that you can put in garage is different
^3
t1b1t1b3
^2
m2a1t1
^4
a4v2p2
                """;
        System.out.println("====================================================================");
        System.out.println(handleInput(second));
    }
}
  • 以上代码仅基于您问题中的数据,不检查无效数据。
  • 代码使用JDK13中首次添加的文本块。(请参考以上代码中方法main中的变量firstsecond)在文本块中,行分隔符是\n
  • 在JDK 9中,Map接口中添加了的
  • 静态方法。我根据您问题中的数据填充了地图。
  • map键类型必须是类(而不是基元)。因此,密钥类型是java.lang.character(而不是char)。自动装箱将字符文本自动转换为字符对象。
  • 输入的第一行决定了应该如何解析和处理其余的输入。我为此使用正则表达式。我检查输入的第一行是否以数字结尾。
  • 在第一行之后,我假设输入的每一行都是^字符,后面跟着一个数字,或者是每一个奇数字符(即第一、第三、第五等)是一个字母,每一个偶数字符是一个数字。因此,如果输入不遵循此模式,代码可能会抛出异常或给出不正确的结果。

希望代码的其余部分是清晰的和自解释的。

#The number of cars that you can put in garage  = 4
Tesla Nissan BMW+ | Porsche+ Tesla Maserati | BMW+ Audi+ | 
Volvo Jaguar Tesla Cadillac | BMW++ Tesla | BMW Audi Maserati Jaguar | BMW+++ | 

====================================================================
#The number of cars that you can put in garage is different
#Number of cars = 3
Tesla BMW Tesla | BMW++ | 
#Number of cars = 2
Maserati+ | Audi Tesla | 
#Number of cars = 4
Audi+++ | Volvo+ Porsche+ | 

 类似资料:
  • 问题内容: 我想读取一个包含空格分隔值的文本文件。值是整数。如何读取并将其放入数组列表? 这是文本文件内容的示例: 我想将它包含在arraylist中。如何用Java做到这一点? 问题答案: 你可以用来将文本文件的所有行都放入。 教程:基本文件读取,写入和创建文本文件 你可以用来基于正则表达式拆分部分。 教程:数字和字符串>字符串>操纵字符串中的字符 你可以使用将转换为。 教程:数字和字符串>字符

  • 问题内容: 如何从Java中classpath读取文本文件? 问题答案: 在类路径上的目录中,从同一类加载器加载的类中,你应该能够使用以下任一种: 如果这些都不起作用,则表明还有其他问题。 因此,例如,使用以下代码: 而这个目录结构: 然后(使用Linux机器上的Unix路径分隔符): 结果:

  • 问题内容: 我有一个文本文件。我想从一行到另一行检索内容。例如,文件可以是200K行。我想从第78行到第2735行读取内容。由于文件可能很大,所以我不想将整个内容读取到内存中。 问题答案: 这是一个可能的解决方案的开始:

  • 问题内容: 我正在制作一个日志,我想读取log.txt文件的最后一行,但是在读取最后一行时,我无法使BufferedReader停止。 这是我的代码: 问题答案: 这是一个很好的解决方案。 在代码中,您可以仅创建一个名为的辅助变量,并不断将其初始化为当前行,如下所示:

  • 可以使用FileReader直接读取文本文件 我们为什么需要使用InputStream方法

  • 本文向大家介绍如何使用python读取Selenium中的文本文件?,包括了如何使用python读取Selenium中的文本文件?的使用技巧和注意事项,需要的朋友参考一下 我们可以通过先创建一个txt文件并在其中包含内容,来使用python阅读Selenium中的文本文件。 首先,我们需要打开文件并提及文本文件位置的路径作为参数。有多种读取方法可以执行这些操作。 read() –读取文件的全部内容