gpt4 book ai didi

Java:根据 "\n"的数量从字符位置计算行号

转载 作者:行者123 更新时间:2023-12-02 08:33:18 24 4
gpt4 key购买 nike

我知道匹配的字符位置,例如 1 3 7 8。我需要知道他们对应的行号。

示例:file.txt

匹配:X

数学:1 3 7 8

想要: 1 2 4 4

$ cat file.txt
X2
X
4
56XX

[补充:没有注意到很多行匹配,可能有更简单的方法使用堆栈来做到这一点]

$ java testt     
1
2
4
$ cat testt.java
import java.io.*;
import java.util.*;
public class testt {

public static String data ="X2\nX\n4\n56XX";
public static String[] ar = data.split("\n");

public static void main(String[] args){
HashSet<Integer> hs = new HashSet<Integer>();
Integer numb = 1;
for(String s : ar){
if(s.contains("X")){
hs.add(numb);
numb++;
}else{
numb++;
}
}
for (Integer i : hs){
System.out.println(i);
}
}
}

最佳答案

首先,您的示例无效 - 字符 X您的样本中的位置 (0,3,9,10) ,不是(1,3,7,8) 。您将换行符排除在计算之外,并且在本应从零开始的情况下从索引 1 开始计数。

将绝对位置与行号关联起来的唯一方法是映射换行符的位置以进行比较。正如其他人所说,即时执行此操作并不困难,只是缓慢且乏味。如果您要进行多次查找,并且您知道数据在两次查找之间不会发生变化,那么您应该创建一个静态 map 。您可以使用 List 或 Map 来实现此目的,但有一个名为 SizeSequence 的类。这非常适合这个目的。看看这个:

import javax.swing.SizeSequence;

public class Test
{
static SizeSequence createLineMap(String s)
{
String[] lines = s.split("(?<=\n)");
SizeSequence sseq = new SizeSequence(lines.length);
for (int i = 0; i < lines.length; i++)
{
sseq.setSize(i, lines[i].length());
}
return sseq;
}

public static void main(String[] args) throws Exception
{
String input = "X2\nX\n4\n56XX";
SizeSequence lineMap = createLineMap(input);
String target = "X";
int pos = -1;
while ((pos = input.indexOf("X", pos+1)) != -1)
{
System.out.printf("'%s' found in line %d (index %d)%n",
target, lineMap.getIndex(pos) + 1, pos);
}
}
}

输出:

'X' found in line 1 (index 0)'X' found in line 2 (index 3)'X' found in line 4 (index 9)'X' found in line 4 (index 10)

请注意我如何在 lookbehind 上进行拆分(?<=\n)而不仅仅是\n 。这样我可以确保每行的字符数包括换行符;必须计算所有字符。 (关于这一点,我知道不同的行分隔符和代理对存在问题,但为了清楚起见,我将它们排除在外。)

您可以通过替换 Scanner 的 findWithinHorizon() 对文件使用相同的技术。方法split()和 'indexOf()`。

关于Java:根据 "\n"的数量从字符位置计算行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2690614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com