splitPreserveAllTokens方法行为

时间:2017-10-11 07:04:46

标签: java

var persons = new kendo.data.ObservableArray(
[
    { 
        name: "John Doe", 
        age: 28,
        hobbies: [
            { id: 1, description: "Baseball", rank: 1 }, 
            {id: 2, description: "music", rank: 3 }, 
            { id: 3, description: "Surfing the web", rank: 2}
        ]
    }, 
    { 
        name: "Jane Doe", 
        age: 24,
        hobbies: [ 
            { id: 1, description: "Volley Ball", rank: 1 }, 
            {id: 2, description: "Cricket", rank: 3 }, 
            { id: 3, description: "Hockey", rank: 2}
        ]
    }
]
);

var viewModel = kendo.observable({
    array: persons 
});

kendo.bind($("#example"), viewModel);



<h2>Persons Array</h2><br/>
<div id="example" data-template="template" data-bind="source: array">
</div>

<script id="template" type="text/x-kendo-template">
    <div>
        Name: #=name# || Age: #=age# <br>
        <ul>Hobbies (below, I want to display hobbies)</ul>
        <br/>
    </div>
</script>

test2有四个元素

  • String string = "Hello,,l,, World"; String test1[] = string.split(",,"); String test2[] = StringUtils.splitPreserveAllTokens(string , ",,");

有两个空元素。 Test1有3个

  • [Hello, , l, , World]

这是预期的行为。

根据[Hello, l, World]的javadoc,以下是逻辑

splitPreserveAllTokens

但是我仍然不清楚test2输出。 请解释test2的其他空元素。

2 个答案:

答案 0 :(得分:3)

在文档中读到:

  

相邻的分隔符被视为空标记的分隔符。

  

separatorChars - 用作分隔符的字符,空格上的空分割

意思是如果你使用&#34;,&#34;它应该没有任何区别。或&#34; ,,&#34;作为第二个论点。

结合第一个引用和示例,我假设字符串的开头和结尾都被视为分隔符:

StringUtils.splitPreserveAllTokens(":cd:ef:", ":") 开始和第一个冒号之间的一个(空)标记,第一个和第二个冒号之间的一个标记(&#34; cd&#34;),第二个和第三个之间的一个标记(&#34; ef&#34;)和一个(再次为空)在最后一个冒号和字符串结尾之间导致文档的显示结果:["", "cd", "ef", ""](带有更正的拼写错误)。

在您的情况下,上面的第二个引用是更相关的引用。 &#34; ,,&#34;不被视为分隔符,而是作为一组分隔符。含义&#34; ,,&#34;相当于&#34;,&#34;在这种情况下。然后按照第一个引用,你可以解释你得到的结果:
字符串的开头到第一个,:&#34;你好&#34;
第一个逗号到第二个:&#34;&#34;
第二个逗号到第三个:&#34; l&#34;
thrid to forth:&#34;&#34;
字符串的结尾:&#34;世界&#34;

答案 1 :(得分:0)

    String string = "Hello$l$ World";

    String test1[] = string.split("$$");

    String test2[] = StringUtils.splitPreserveAllTokens(string , "$$");

输出:

  Test2  [Hello, l,  World]
  Test1  [Hello$l$ World]

以下是splitPreserveAllTokens的代码

  // standard case
        while (i < len) {
            if (separatorChars.indexOf(str.charAt(i)) >= 0) {
                if (match || preserveAllTokens) {
                    lastMatch = true;
                    if (sizePlus1++ == max) {
                        i = len;
                        lastMatch = false;
                    }
                    list.add(str.substring(start, i));
                    match = false;
                }
                start = ++i;
                continue;
            }
            lastMatch = false;
            match = true;
            i++;
        }
    }

这意味着分隔符字符将被视为一组单独的分隔符字符。每当在主字符串上找到任何分隔符时,它将被分割。

使用此方法优于常规拆分的优势是

  

splitPreserveAllTokens方法隐式处理null。

如上所述

  StringUtils中的

使用splitWorker(String str,char separatorChar,boolean preserveAllTokens),它是自己的方法,它是2.0的性能调优(JDK1.4)。   Difference between splitByWholeSeparatorPreserveAllTokens and split