能否设置Java CharBuffer的位置?

3

我想解析一个字符串,但要能够比较,例如

  • 在位置x处的1个字符
  • 在位置x处的2个字符
  • ...
  • 在位置x处的n个字符

如果失败了

  • 在位置x+1处的1个字符
  • 在位置x+1处的2个字符
  • ...
  • 在位置x+1处的n个字符

以此类推,直到找到匹配项或到达EOS。

使用数组很容易做到这一点,但是我想在一个方法中完成这一点,并返回一个缓冲区,该缓冲区具有指向下一个开始处理的位置的索引。我被告知CharBuffer是一个很好的解决方案,但我不确定。

编辑举例说明-不是可以编译的代码!

Main

List template1 = new List();
List template2 = new List();
String exampleInput = "oneone two";

template1.add ( "one" );
template1.add ( "two" );
template1.add ( "three" );

template2.add ( "one" );
template2.add ( "one" );
template2.add ( "two" );

Set templates = new Set();
templates.add ( template1 );
templates.add ( template2 );

NoisyParser np = new NoisyParser();
np.parse( templates, exampleInput );

NoisyParser

void parse( Set templates, Sting inp ){
     iterate over each template that matches inp{
        find_match( template, inp );
     }
}

boolean find_match( template, inp ) {
    This is where I need the magic to work out if the current element
    in template matches the current position of inp, or inp+1, give or take.
}

您的具体需求是什么?是比较两个字符串并找到它们第一次不匹配的位置吗?还是要比较n个字符串? - G_H
有点复杂,我有一些字符串列表,想要将它们与嘈杂的输入字符串匹配,以查看哪个列表匹配(如果有)。 - Wil
我认为提供一个小例子会更好。比如,一个包含两个字符串的列表,另一个包含三个字符串的列表和输入字符串,然后指定您期望的结果是什么。从帖子中确切的要求有点难以理解。 - G_H
2个回答

2

CharBuffer有一个内部索引,可以从中进行相对读取,因此,它应该符合您的标准。

您可以使用(继承的)Buffer.position(int newPosition)方法设置位置。

您还可以将位置标记为mark,并将其重置为先前的标记reset


由于NIO包中的类通常用于(并且意味着用于)I/O,我建议您考虑在类中封装char[]int pos

class PositionableCharArray {
    int pos;
    char[] chars;

    ...
    public void setPos(int pos) { ... }
    public char readChar() { return chars[pos++]; }
}

他不能直接重用java.text.ParsePosition吗?听起来它就是为这个而设计的。 - G_H
谢谢回复,按照我想要使用它们的方式,您的PositionaleCharArray和CharBuffer不是同一件事吗? - Wil
1
可能。PositionableCharArray 接口更小,这使得更容易确保一些不变量的保持(例如 chars 从不改变,0 <= pos < chars.length 等等...)。如果您将来将 CharBuffer 传递给某个方法,并且该方法认为 clear 缓冲区很方便,那么会怎样呢?此外,由于该类将具有更清晰的目的,因此它将简化代码阅读等操作。 - aioobe

1

你可以使用Buffer.charAt(int)来获取相对于当前位置的字符,使用Buffer.get()来推进当前位置。或者你可以使用Buffer操作来操纵位置。

但我认为最好实现自己的类,将字符读入char[](或String)中,并提供执行所需原始操作的方法。使用CharBuffer可能会得到更高效的解决方案,但很有可能这不是性能瓶颈。


谢谢,这似乎是共识。我可能会尝试把一个缓冲区塞进我想要的东西里。 - Wil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接