Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中拆分字符串然后添加到ArrayList的更快方法_Java_Performance_Arraylist_Split - Fatal编程技术网

在java中拆分字符串然后添加到ArrayList的更快方法

在java中拆分字符串然后添加到ArrayList的更快方法,java,performance,arraylist,split,Java,Performance,Arraylist,Split,在学校的一个项目中,我被要求用Java编写一个简单的数学解析器。程序运行良好。非常好,我使用NetBeans探查器工具来检查程序的性能。为此,我对以下表达式的数学解析器进行了1000次循环调用:“1-((x+1)+1)*2”,其中x被当前循环计数替换。花费了262ms。问题是,方法splitFormula花费了50%的时间,我将在下面介绍: private static void splitFormula(String formula){ partialFormula=new Array

在学校的一个项目中,我被要求用Java编写一个简单的数学解析器。程序运行良好。非常好,我使用NetBeans探查器工具来检查程序的性能。为此,我对以下表达式的数学解析器进行了1000次循环调用:
“1-((x+1)+1)*2”
,其中
x
被当前循环计数替换。花费了
262ms
。问题是,方法splitFormula花费了50%的时间,我将在下面介绍:

private static void splitFormula(String formula){
    partialFormula=new ArrayList<>();

    for(String temp: formula.split("\\+|\\-|\\*|\\/"))
        partialFormula.add(temp);
}
private静态void splitFormula(字符串公式){
partialFormula=新的ArrayList();
用于(字符串温度:formula.split(“\\+\\\-\\\\\*\\\/”)
部分公式添加(温度);
}
,其中partialFormula是字符串的
ArrayList
。要对表达式进行数值计算,我需要多次调用splitFormula方法,因此我确实需要清除partialFormula
ArrayList
-第一行的内容


我的问题是:有没有更快的方法拆分字符串,然后将部分字符串添加到arraylist?或者是否有其他方法可以用来拆分字符串,然后使用子字符串?

对于循环,您不需要
split
返回一个数组,您可以从数组中创建一个
ArrayList

partialFormula = new ArrayList<>(Arrays.asList(formula.split("\\+|\\-|\\*|\\/")));
partialFormula=newarraylist(Arrays.asList(formula.split(\\+\\\-\\\\\\\\*\\/”));

我不知道这是否明显更快

尝试预先分配ArrayList,这样我们就不必在列表增长时为重新分配付费。下面的数字
20
只是一个占位符。选择一个比您期望的最大表达式稍大的数字

partialFormula=new ArrayList<String>(20);
partialFormula=newarraylist(20);

请参阅,以了解这可能给您带来的好处。

正则表达式可以降低速度(
String#split
使用正则表达式)。一般来说,如果您想编写简单的代码,正则表达式是好的,但如果您想编写快速的代码,请查看是否有其他方法。尝试在不使用正则表达式的情况下执行此操作:

编辑:这应该是一种更好的方法(跟踪索引,而不是附加到
StringBuilder
):


如果我们看一下的源代码,就会明白为什么速度较慢(从GrepCode):

它每次都编译一个正则表达式!因此,我们可以看到加速代码的另一种方法是先编译正则表达式,然后使用

//In constructor, or as a static variable.
//This regex is a better form of yours.
Pattern operatorPattern = Pattern.compile("[-*+/]");
...
private static void splitFormula(String formula){
    partialFormula.clear();

    for(String temp: operatorPattern.split(formula)) {
        partialFormula.add(temp);
    }
}

这将创建字符串的arrayList

String a= "1234+af/d53";
    char [] blah=a.toCharArray(); 
    ArrayList<String> list=new ArrayList<String>();
    for (int i = 0; i < blah.length; i++) {
        list.add(Character.toString(blah[i]));  
    }
String a=“1234+af/d53”;
char[]blah=a.toCharArray();
ArrayList=新建ArrayList();
for(int i=0;i
ArrayList以一定的大小开始并不断增长。例如,如果数组列表的大小为10,并且您添加了第11个元素,那么将分配一个大小为20的新数组列表,并将旧数组列表的所有元素复制到新数组列表中,依此类推。试试链表吧。@MohanKumar我不知道。让我看看你的建议。谢谢,我在想。使用
partialFormula.clear()
代替上面提到的“清除”不是更好的主意吗?我认为您需要使用Pattern和Matcher手动解析公式。@MohanKumar链表增加了间接寻址,数组则没有。不断增长的操作几乎总是在缓存上执行,这比链表间接引入的开销要快得多让我快速检查一下您的建议=)遗憾的是,事实并非如此。这需要更长的时间。这个方法比循环花费了将近100毫秒=/Simpler regex:
[-+*/]
@PML天啊。抱歉。是的,它将创建字符串数组列表。但这不是OP想要的。您的示例字符串是列表
1,2,3,4,+,a,f,?,d,5,3
,而OP需要
1234,af,d53
,我误解了。它应该是字符串[]blah=a.split(\\+\\-\*\\\\/”;然后使用list.add(blah[i]);这正是OP所拥有的,但代码行数更多。您的代码中有一个缺陷。我用表达式1+2试过了,你的代码只代表第一个元素:“1”。但是我真的不认为你的代码有什么问题。忘记在字符串末尾添加:-)它可以工作。它只是在最后一个语句中缺少了一个“')”。我非常感谢你的时间和解释。整个程序现在只需要134ms。该方法本身现在需要13.1ms。非常感谢你!在“partialFormula.add(formula.substring(lastIndex);”中缺少一个“')”来关闭.add方法=)@PML,这说明了不使用IDE回答堆栈溢出问题的危险。
public String[] split(String regex, int limit) {
    return Pattern.compile(regex).split(this, limit);
}
//In constructor, or as a static variable.
//This regex is a better form of yours.
Pattern operatorPattern = Pattern.compile("[-*+/]");
...
private static void splitFormula(String formula){
    partialFormula.clear();

    for(String temp: operatorPattern.split(formula)) {
        partialFormula.add(temp);
    }
}
String a= "1234+af/d53";
    char [] blah=a.toCharArray(); 
    ArrayList<String> list=new ArrayList<String>();
    for (int i = 0; i < blah.length; i++) {
        list.add(Character.toString(blah[i]));  
    }