Java 在分隔字符串中查找第n个字符串

Java 在分隔字符串中查找第n个字符串,java,android,Java,Android,有人知道如何在分隔符(分隔符)可以是单个字符或多个字符的分隔符字符串中找到第n个字段(字符串)吗 比如说, string = "one*two*three" separator = "*" 用户定义函数的语法为FindNthField(字符串、分隔符、位置) 因此位置3将返回3 实际使用的分隔符是Chr(13) 这必须在Android上运行,因此应该是高效的 如果您有任何建议,我们将不胜感激。String#split是您的朋友: private String findNthField(Str

有人知道如何在分隔符(分隔符)可以是单个字符或多个字符的分隔符字符串中找到第n个字段(字符串)吗

比如说,

string = "one*two*three"

separator = "*"
用户定义函数的语法为
FindNthField(字符串、分隔符、位置)

因此位置3将返回
3

实际使用的分隔符是
Chr(13)

这必须在Android上运行,因此应该是高效的

如果您有任何建议,我们将不胜感激。

String#split
是您的朋友:

private String findNthField(String input, int position) {
  return findNthField(input, "\n", position);
}

private String findNthField(String input, String regExp, int lineNr) {
  if (input == null || regExp == null || regExp.equals(""))
    throw new IllegalArgumentException("your message");

  String[] parts = input.split(regExp);
  if (parts.length < lineNr) 
       return "";                 // local convention

  return parts[lineNr-1];
}
private String findNthField(字符串输入,int位置){
返回findNthField(输入“\n”,位置);
}
私有字符串findNthField(字符串输入、字符串regExp、int lineNr){
if(input==null | | regExp==null | | regExp.equals(“”))
抛出新的IllegalArgumentException(“您的邮件”);
String[]parts=input.split(regExp);
如果(零件长度<线号)
返回“”;//本地约定
退货零件[lineNr-1];
}

也许是这样的

public String FindNthField(String string, String separator, int position) {
    String[] splits = string.split(separator);
    if (splits.length < position) {
        return null;
    }

    return splits[position - 1];
}
publicstringfindnthfield(字符串、字符串分隔符、int位置){
String[]splits=String.split(分隔符);
if(拆分长度<位置){
返回null;
}
返回拆分[位置-1];
}
显然,您的
分隔符
必须是
regex
字符串,并且我没有执行
null
检查

import org.junit.Assert;
导入org.junit.Test;
导入java.util.ArrayList;
导入java.util.List;
公共类拆分测试{
@试验
public void testFindNthField(){
最终拆分器拆分器=新拆分器();
Assert.assertEquals(“result”,“three”,splitter.findNthField(“one*two*three”,“'*',3));
}
私有类拆分器{
公共字符串findNthField(最终字符串输入、最终字符分隔符、最终整数位置){
最终列表零件=新的ArrayList();
final char[]chars=新字符[input.length()];
getChars(0,input.length(),chars,0);
int-wordStart=0;
for(int idx=0;idx
@Andreas\u D,我实际上复制了OP的方法…但是如果你想的话,我可以很容易地重命名它。(@先生们-是的,对不起,先评论,然后看到名称被复制,然后删除了我的评论;)-一分钟之内就完成了)@Andreas\u D,没问题…现在,我之前的评论看起来很奇怪,因为我似乎在回复一个鬼评论…)我发布了一个基于String.split()的答案,但看到OP想要使用字符拆分器,所以我对其进行了更改。我对其进行了计时,并将其与其他两个字符串分隔符示例进行了比较,虽然它们当然可以处理字符串分隔符,但它的速度是其他两个示例的两倍。我将使用两个版本-谢谢you@Malkoma:那么你有没有可能接受这个或另一个呢?如果你正在使用它的话,可能是一个向上投票?非常感谢-这三个示例都是第一次使用的。我发现了一个对现在不推荐的Java函数的引用-peekNthDelimitedField(Java.lang.String String,char separator,int-nth,boolean trim)将给定的字符串视为分隔符分隔的字符串,并返回此字符串的第n个字段。感谢您的快速响应,它帮助我理解了字符串拆分。
import org.junit.Assert;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class SplitterTest {
    @Test
    public void testFindNthField() {
        final Splitter splitter = new Splitter();
        Assert.assertEquals("result", "three", splitter.findNthField("one*two*three", '*', 3));
    }

    private class Splitter {
        public String findNthField(final String input, final char separator, final int position) {
            final List<String> parts = new ArrayList<String>();
            final char[] chars = new char[input.length()];
            input.getChars(0, input.length(), chars, 0);
            int wordStart = 0;
            for (int idx = 0; idx < chars.length; idx++) {
                if (chars[idx] == separator) {
                    parts.add((String) input.subSequence(wordStart, idx));
                    wordStart = idx + 1;
                }
            }
            parts.add(input.substring(wordStart));
            return parts.get(position - 1);
        }
    }
}