如何在Java中第二次出现字符之前拆分字符串

如何在Java中第二次出现字符之前拆分字符串,java,string,function,split,Java,String,Function,Split,我有: 1234 2345 3456 4567 当我尝试String.split(“,2)时,我得到: {1234} , {2345 3456 4567} 但我需要: {1234},{2345} 我只想要前两个元素。如何在Java中实现此功能? 提前谢谢。 编辑:这只是一个庞大数据集的一行 通过调用indexOf两次,找到包含所需内容的子字符串 仅对该子字符串使用split() 这里有一个替代解决方案,它只使用indexOf和子字符串 public class Program{

我有:

1234 2345 3456 4567
当我尝试
String.split(“,2)
时,我得到:

{1234} , {2345 3456 4567}
但我需要:

{1234},{2345}
我只想要前两个元素。如何在Java中实现此功能?
提前谢谢。

编辑:这只是一个庞大数据集的一行

  • 通过调用
    indexOf
    两次,找到包含所需内容的子字符串
  • 仅对该子字符串使用
    split()
  • 这里有一个替代解决方案,它只使用
    indexOf
    子字符串

    public class Program{
        public static void main(String[] args) {
            String input = "1234 2345 3456 4567";
            int firstIndex = input.indexOf(" ");
            int secondIndex = input.indexOf(" ", firstIndex + 1);
            String[] output = new String[] {input.substring(0, firstIndex),
                input.substring(firstIndex+1, secondIndex)};
            System.out.println(output[0]);
            System.out.println(output[1]);
        }
    }
    
    输出:

    1234
    2345
    
    您可以这样做:-

    String[] s=string.split("");
    s[2]=null;
    s[3]=null;
    
    现在只有{1234},{2345}

    或者更好的方法是,将字符串本身分开,然后应用split()


    我假设您需要前两个字符串,然后执行以下操作:

        String[] res = Arrays.copyOfRange(string.split(" "), 0, 2);
    
    应能工作的easiset(但不是最快的)是首先拆分字符串

    String test = "123 2345 3456 4567"
    String[] splitted = test.split(" ");
    
    并将切片转换为结果数组:

    String[] result = Arrays.copyOfRange(splitted, 2);
    

    这在大多数情况下都很有效。唯一的问题可能是,当中间数组变得非常大时。然后,您将拥有大量中间内存,垃圾收集器必须清理这些内存。但对于现代优化(如escape analysis),即使这样也可能不会对性能产生太大影响。

    您有任何选择,一个是进行拆分并复制前两个结果

    下一个代码具有下一个输出:

    前两个:
    1234

    2345

    另一种方法是用regexp替换原始字符串,然后执行拆分:

    下一个代码的结果(我们将空格替换为):

    过滤:1234:2345

    前两项:

    1234

    2345


    另一种单线解决方案是:

    让我们假设您有:

    String a="1234 2343545 356 88";
    
    因此,单行命令是:

    String b[]=a.substring(0,a.indexOf(" ",a.indexOf(" ")+1)).split(" ");
    
    现在,您将“b”作为第一次出现的两个数组:

    b[0] //1234
    b[1] //2343545 
    

    我知道,我考虑过这个问题,但有更简单的解决方案吗?@kaushaya,不是真的,没有。据我所知,这个问题没有库函数。@kaushaya,我刚刚添加了第二个根本不使用string.split的解决方案。如果你关心速度,你可能应该将这个解决方案与执行
    拆分的解决方案进行基准测试
    Arrays.copyOfRange()
    并使用更快的方法。在每个空间上进行拆分,然后只使用结果数组的前2个元素,效果如何?效率会稍低一些。我已经考虑过了。空间还是时间?有时我宁愿放弃效率,而不是重新设计周空间和“代码”明智的。
        public static void main(String[] args) {
        String input="1234 2345 3456 4567";
    
        //we find first 2 and separate with :
        String filteredInput= input.replaceFirst("^([^\\s]*)\\s([^\\s]*)\\s.*$", "$1:$2");
        System.out.println("Filtered: "+filteredInput);
    
        String[] parts= filteredInput.split(":");
        System.out.println("First two: ");
        System.out.println("--------");
        for(String part:parts){
            System.out.println(part);
        }
        System.out.println("--------");
    
    }
    
    String a="1234 2343545 356 88";
    
    String b[]=a.substring(0,a.indexOf(" ",a.indexOf(" ")+1)).split(" ");
    
    b[0] //1234
    b[1] //2343545