<p>Java Boon切片表示法允许所有这一切,并带有字符串、列表、集合、映射等</p>
<p>许多语言都有切片符号(Ruby、Groovy和Python)。Boon将此添加到Java中。</p>
<p>Boon有三个slc操作符:<strong>slc</strong>,<strong>slc</strong>(仅限启动)和<strong>slcEnd</strong>。</p>
<p>使用Boon,您可以对字符串、数组(基元和泛型)、列表、集合、树集合、树映射等进行切片。</p>
<p>切片符号-温和的介绍</p>
<p>boon slice运算符的工作方式与Python/Ruby slice表示法类似:</p>
<p><strong>红宝石切片符号</strong></p>
<pre><code> arr = [1, 2, 3, 4, 5, 6]
arr[2] #=> 3
arr[-3] #=> 4
arr[2, 3] #=> [3, 4, 5]
arr[1..4] #=> [2, 3, 4, 5]
</code></pre>
<p><strong>Python切片表示法</p>
<pre><code>string = "foo bar"
string [0:3] #'foo'
string [-3:7] #'bar'
</code></pre>
<p>以下内容来自于对Python切片表示法的出色描述:</p>
<p>切片标记的基本原理如下:</p>
<p><strong>Python切片表示法</p>
<pre><code> a[ index ] # index of item
a[ start : end ] # items start through end-1
a[ start : ] # items start through the rest of the array
a[ : end ] # items from the beginning through end-1
a[ : ] # a copy of the whole array
</code></pre>
<p><strong>使用Boon的Java切片表示法:</strong></p>
<pre><code> idx( index ) // index of item
slc( a, start, end ) // items start through end-1
slc( a, start ) // items start through the rest of the array
slcEnd( a, end ) // items from the beginning through end-1
copy( a ) // a copy of the whole array
</code></pre>
<p><strong>slc</strong>表示切片
<strong>idx</strong>表示索引
<strong>slcEnd</strong>表示结束切片。
<strong>copy</strong>代表好的,嗯,当然是copy</p>
<p>要记住的关键点是,结束值表示不在选定切片中的第一个值。因此,结束和开始之间的区别在于所选元素的数量。
另一个特性是start或end可以是负数,这意味着它从数组的末尾而不是开头开始计数。</p>
<p>因此:</p>
<p><strong>带负索引的Python切片表示法</p>
<pre><code> a[ -1 ] # last item in the array
a[ -2: ] # last two items in the array
a[ :-2 ] # everything except the last two items
</code></pre>
<p><strong>Java负索引</strong></p>
<pre><code> idx ( a, -1) // last item in the array
slc ( -2 ) // last two items in the array
slcEnd( -2 ) // everything except the last two items
</code></pre>
<p>Python和Boon对程序员很好,如果项目比您要求的要少:Python不允许您越界,如果您这么做,它会返回一个空列表。Boon遵循这一传统,但提供了一个选项来获取越界的异常(稍后介绍)。在Python和Boon中,如果你走远了,就得到长度,如果你试图在0以下,就得到0(计算后在0以下)。相反,Ruby给你一个空指针(Nil)。Boon复制Python样式,因为Boon的目标之一是避免返回null(您会得到一个异常,Option)。(Boon有第二个名为zlc的运算符,它抛出了一个越界索引异常,但大多数人应该使用slc。)</p>
<p>例如,如果您要求slcEnd(a,-2)(a[:-2]),而a只包含一个元素,则会得到一个空列表而不是一个错误。有时候你更喜欢这个错误,有了Boon你就有了这个选择。</p>
<p><strong>更多切片</strong></p>
<p>下面是一些基本的Java类型、列表、数组、蔬菜、原始字符数组和原始字节数组。</p>
<p>在Boon中声明要使用的变量</p>
<pre><code>//Boon works with lists, arrays, sets, maps, sorted maps, etc.
List<String> fruitList;
String [] fruitArray;
Set<String> veggiesSet;
char [] letters;
byte [] bytes;
NavigableMap <Integer, String> favoritesMap;
Map<String, Integer> map;
//In Java a TreeMap is a SortedMap and a NavigableMap by the way.
</code></pre>
<p>Boon附带了helper方法,允许您轻松创建列表、集合、映射、并发映射、排序的映射、排序的集合等。helper方法有safeList、list、set、sortedSet、safeSet、safeSortedSet等。其思想是让Java感觉更像list和maps是内置类型的。</p>
<p>初始化集合、列表、字符串数组、字符数组和字节数组</p>
<pre><code>veggiesSet = set( "salad", "broccoli", "spinach");
fruitList = list( "apple", "oranges", "pineapple");
fruitArray = array( "apple", "oranges", "pineapple");
letters = array( 'a', 'b', 'c');
bytes = array( new byte[]{0x1, 0x2, 0x3, 0x4});
</code></pre>
<p>甚至还有创建映射和排序映射的方法,称为map、sortedMap、safeMap(concurrent)和sortedSafeMap(concurrent)。创建它们的主要原因是Java没有用于列表、映射等的文本</p>
<p>Java:使用map操作符生成SortedMap和map</p>
<pre><code> favoritesMap = sortedMap(
2, "pineapple",
1, "oranges",
3, "apple"
);
map = map (
"pineapple", 2,
"oranges", 1,
"apple", 3
);
</code></pre>
<p>您可以使用idx运算符索引映射、列表、数组等。</p>
<p><strong>Java:使用Boon Java idx运算符获取索引处的值</p>
<pre><code> //Using idx to access a value.
assert idx( veggiesSet, "b").equals("broccoli");
assert idx( fruitList, 1 ).equals("oranges");
assert idx( fruitArray, 1 ).equals("oranges");
assert idx( letters, 1 ) == 'b';
assert idx( bytes, 1 ) == 0x2;
assert idx( favoritesMap, 2 ).equals("pineapple");
assert idx( map, "pineapple" ) == 2;
</code></pre>
<p>idx操作符也可以处理负索引。</p>
<p><strong>Java:使用带负值的idx运算符</strong></p>
<pre><code> //Negative indexes
assert idx( fruitList, -2 ).equals("oranges");
assert idx( fruitArray, -2 ).equals("oranges");
assert idx( letters, -2 ) == 'b';
assert idx( bytes, -3 ) == 0x2;
</code></pre>
<p>Ruby、Groovy和Python都有这个特性。现在你也可以在Java中使用它了!Java版本(Boon)与基元数组一起工作,因此您不会自动装箱。</p>
<p>Ruby和Python做的事情没有用于sortedset和sortedmap的is切片表示法。
可以使用切片表示法在Java中搜索排序的映射和排序的集</p>
<p><strong>切片标记适用于已排序的地图和已排序的集。</strong></p>
<p>下面是一个将几个概念组合在一起的示例。</p>
<pre><code> set = sortedSet("apple", "kiwi", "oranges", "pears", "pineapple")
slcEnd( set, "o" ) //returns ("oranges", "pears", "pineapple")
slc( set, "ap", "o" ) //returns ("apple", "kiwi"),
slc( set, "o" ) //returns ("apple", "kiwi")
</code></pre>
<p>您实际上是在对已排序的映射进行切片,而已排序的集是排序之间的查询。
“pi”后面是什么?</p>
<pre><code> after(set, "pi") //pineapple
</code></pre>
<p>在菠萝之前呢?</p>
<pre><code> before(set, "pi")
</code></pre>
<p>好吧,让我们一步一步来。。。。</p>
<pre><code> NavigableSet<String> set =
sortedSet("apple", "kiwi", "oranges", "pears", "pineapple");
assertEquals(
"oranges", idx(set, "ora")
);
</code></pre>
<p>记住:TreeSet实现NavigableSet和SortedSet。</p>
<p>这是从我的博客。。。。</p>
<p><a href="http://rick-hightower.blogspot.com/2013/10/java-slice-notation-to-split-up-strings.html" rel="nofollow noreferrer">http://rick-hightower.blogspot.com/2013/10/java-slice-notation-to-split-up-strings.html</a></p>
<p>还有更多的例子。</p>
<p>我从这个关于Python切片的讨论中得到了一些措辞。</p>
<p><a href="https://stackoverflow.com/questions/509211/pythons-slice-notation">Explain Python's slice notation</a></p>
<p>以下是Boon项目链接:</p>
<p><a href="https://github.com/RichardHightower/boon" rel="nofollow noreferrer">https://github.com/RichardHightower/boon</a></p>
<p>现在让我们继续切!</p>
<p>我们可以使用以下命令查找以“o”开头的集合中的第一个水果:</p>
<pre><code>idx(set, "o")
</code></pre>
<p>这是我们之前制作的一套水果(一套是有“苹果”、“猕猴桃”的树),
“橘子”,“梨”,“菠萝”在里面)。</p>
<pre><code> assertEquals(
"oranges", idx(set, "o")
);
</code></pre>
<p>我们找到橘子了!</p>
<p>这又是一次,但这一次我们正在寻找以“p”开头的水果,即idx(set,“p”)。</p>
<pre><code> assertEquals(
"pears",
idx(set, "p")
);
</code></pre>
<p>是啊!我们找到梨了!</p>
<p>以“圆周率”开头的水果怎么样,比如“菠萝”-idx(set,“圆周率”)</p>
<pre><code> assertEquals(
"pineapple",
idx(set, "pi")
);
</code></pre>
<p>你也可以要求在另一个项目之后的项目。“pi”后面是什么?
之后(设置为“pi”)</p>
<pre><code> assertEquals(
"pineapple",
after(set, "pi")
);
</code></pre>
<p>“菠萝”在“π”之后。顺便说一下,after和idx是一样的。那我为什么要加一个after呢?所以我可以有一个以前!!!:)
如果你想知道“π”之前是什么呢?</p>
<p><strong>之前(设置“pi”)</strong></p>
<pre><code> assertEquals(
"pears",
before(set, "pi")
);
</code></pre>
<p>所有介于“ap”和“o”之间的水果怎么样?正如我所承诺的,有切片符号!</p>
<p><strong>slc(设置,“ap”,“o”)</strong></p>
<pre><code> assertEquals(
sortedSet("apple", "kiwi"),
slc(set, "ap", "o")
);
</code></pre>
<p>“o”之后的水果怎么样?</p>
<p><strong>slc(设置“o”)</strong></p>
<pre><code> assertEquals(
sortedSet("apple", "kiwi"),
slc(set, "o")
);
</code></pre>
<p>所以“o”后面的水果都是“苹果”和“猕猴桃”。</p>
<p>到“o”为止的水果怎么样?(当我切下末端时,斯莱森德读到了。)</p>
<p><strong>slcEnd(设置“o”)</strong></p>
<pre><code> assertEquals(
sortedSet("oranges", "pears", "pineapple"),
slcEnd(set, "o")
);
</code></pre>
<p>所以所有的水果包括“o”都是“橘子”、“梨”和“菠萝”。</p>
<p>为类似列表的东西进行安全切片</p>
<p>如果索引超出界限,这些运算符将引发异常:</p>
<p><strong>使用Boon的Java切片表示法如下:</strong></p>
<pre><code> ix( index ) // index of item
zlc( a, start, end ) // items start through end-1
zlc( a, start ) // items start through the rest of the array
zlcEnd( a, end ) // items from the beginning through end-1
</code></pre>
<p><strong>zlc</strong>表示零公差片
<strong>ix</strong>表示零公差指数
<strong>zlcEnd</strong>表示零公差端片。
<strong>copy</strong>代表好的,嗯,当然是copy</p>
<p>男孩和女孩。。。记住要对你不知道的东西进行安全切片。</p>
<p>也适用于原语,因此没有自动装箱</p>
<p><strong>索引基元</strong></p>
<pre><code> byte[] letters =
array((byte)'a', (byte)'b', (byte)'c', (byte)'d');
assertEquals(
'a',
idx(letters, 0)
);
assertEquals(
'd',
idx(letters, -1)
);
assertEquals(
'd',
idx(letters, letters.length - 1)
);
idx(letters, 1, (byte)'z');
assertEquals(
(byte)'z',
idx(letters, 1)
);
</code></pre>
<p>len和idx方法是通用运算符,它们处理列表、数组、集合、映射等</p>
<p><strong>len</strong>给我数组、列表、映射的长度。
<strong>idx</strong>在数组like、list like、map like中的“index”位置给我项。</p>
<p><strong>主控字符串切片!</strong></p>
<p>下面是Boon Java字符串切片的一些示例</p>
<pre><code> String letters = "abcd";
boolean worked = true;
worked &=
idx(letters, 0) == 'a'
|| die("0 index is equal to a");
worked &=
idx(letters, -1) == 'd'
|| die("-1 index is equal to a");
</code></pre>
<p>另一种表示idx(letters,-1)=“d”的方法是idx(letters,letters.length()-1)=“d”!
我喜欢较短的路!</p>
<pre><code> worked &=
idx(letters, letters.length() - 1) == 'd'
|| die("another way to express what the -1 means");
//We can modify too
letters = idx(letters, 1, 'z');
worked &=
idx(letters, 1) == 'z'
|| die("Set the 1 index of letters to 'z'");
worked &= (
in('a', letters) &&
in('z', letters)
) || die("'z' is in letters and 'a' is in letters");
</code></pre>
<p>切片切片宝贝!</p>
<pre><code> letters = "abcd";
worked &=
slc(letters, 0, 2).equals("ab")
|| die("index 0 through index 2 is equal to 'ab'");
worked &=
slc(letters, 1, -1).equals("bc")
|| die("index 1 through index (length -1) is equal to 'bc'");
worked &=
slcEnd(letters, -2).equals("ab")
|| die("Slice of the end of the string!");
worked &=
slcEnd(letters, 2).equals("ab")
|| die("Vanilla Slice Slice baby!");
</code></pre>
<p>穿上我的5.0,把我的抹布上衣拿下来,这样我的头发就可以吹了!切片宝贝!!!</p>