Java Boon切片符号允许所有这些,并且适用于字符串、列表、集合、映射等等。
许多语言都有切片符号(例如Ruby、Groovy和Python)。Boon将其添加到了Java中。
Boon有三个slc运算符:
slc、
slc(仅限开始)和
slcEnd。
使用Boon,您可以对字符串、数组(基本类型和泛型)、列表、集合、树集、树映射等进行切片操作。
切片符号-一个简单的介绍
Boon切片运算符的工作方式类似于Python/Ruby的切片符号:
Ruby切片符号:
arr = [1, 2, 3, 4, 5, 6]
arr[2]
arr[-3]
arr[2, 3]
arr[1..4]
Python切片符号
string = "foo bar"
string [0:3] #'foo'
string [-3:7] #'bar'
以下内容源自一篇关于Python切片符号的优秀文章:
切片符号的基础知识如下:
Python切片符号
a[ index ]
a[ start : end ]
a[ start : ]
a[ : end ]
a[ : ]
使用Boon的Java切片表示法:
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
slc 代表切片
idx 代表索引
slcEnd 代表结束切片。
copy 代表复制
需要记住的关键点是,结束值代表未被选择的第一个值。因此,结束和开始之间的差异是所选元素的数量。
另一个特点是,开始或结束可能是负数,这意味着它从数组的末尾开始计算,而不是从开头开始。
因此:
Python 带有负索引的切片符号
a[ -1 ]
a[ -2: ]
a[ :-2 ]
Java负索引
idx ( a, -1) // last item in the array
slc ( -2 ) // last two items in the array
slcEnd( -2 ) // everything except the last two items
Python和Boon对程序员很友好,如果你请求的项数比实际少,Python不允许你越界,如果你这样做,最坏的情况是返回一个空列表。 Boon遵循这个传统,但提供了一个选项来获取越界异常(稍后描述)。在Python和Boon中,如果你走得太远,你会得到长度,如果你试图去0以下,你会得到0(计算后小于0)。相反,Ruby会给你一个空指针(Nil)。 Boon复制了Python的风格,因为Boon的目标之一是避免返回null(你会得到一个异常,Option)。 (Boon有第二个叫做zlc的运算符,它会抛出一个越界索引异常,但大多数人应该使用slc。)
例如,如果你请求slcEnd(a,-2)(a[:-2])而a只包含一个元素,则会返回一个空列表而不是错误。有时你可能更喜欢错误,在Boon中你有这个选项。
更多切片
这里有一些基本的Java类型,列表、数组、蔬菜、原始字符数组和原始字节数组。
声明变量以在Boon中使用
List<String> fruitList;
String [] fruitArray;
Set<String> veggiesSet;
char [] letters;
byte [] bytes;
NavigableMap <Integer, String> favoritesMap;
Map<String, Integer> map;
Boon提供的帮助方法可以轻松创建列表、集合、映射、并发映射、排序映射、排序集合等。这些辅助方法包括safeList、list、set、sortedSet、safeSet、safeSortedSet等。其目的是使Java中的列表和映射等数据类型更易于使用。
初始化字符串集、列表、字符数组和字节数组。
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});
有一些方法可以创建地图和排序地图,称为map、sortedMap、safeMap(并发)和sortedSafeMap(并发)。这些主要是因为Java没有列表、地图等字面量而创建的。
Java:使用map运算符生成SortedMap和Map。
favoritesMap = sortedMap(
2, "pineapple",
1, "oranges",
3, "apple"
);
map = map (
"pineapple", 2,
"oranges", 1,
"apple", 3
);
你可以使用 idx 运算符来索引地图、列表、数组等。
Java:使用 Boon Java 的 idx 运算符来获取索引处的值。
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;
idx运算符也可以使用负索引。
Java:使用idx运算符与负值
assert idx( fruitList, -2 ).equals("oranges");
assert idx( fruitArray, -2 ).equals("oranges");
assert idx( letters, -2 ) == 'b';
assert idx( bytes, -3 ) == 0x2;
Ruby、Groovy和Python都有这个特性。现在你也可以在Java中使用它了!Java版本(Boon)适用于原始数组,因此您将不会自动装箱。
Ruby和Python没有的是SortedSets和SortedMaps的切片表示法。您可以在Java中使用切片表示法来搜索排序映射和排序集合。
切片表示法适用于排序映射和排序集合。
以下是一个将几个概念结合在一起的示例。
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")
你正在处理排序映射和排序集的切片操作,这类似于一个区间查询。
“pi”之后是哪个项目?
after(set, "pi") //pineapple
还有菠萝之前呢?
before(set, "pi")
好的,让我们一步一步地来...
NavigableSet<String> set =
sortedSet("apple", "kiwi", "oranges", "pears", "pineapple");
assertEquals(
"oranges", idx(set, "ora")
);
记住:TreeSet实现了NavigableSet和SortedSet。
这是从我的博客中得出的......
http://rick-hightower.blogspot.com/2013/10/java-slice-notation-to-split-up-strings.html
还有更多的例子。
我从Python切片讨论中推导出了一些措辞。
解释Python的切片符号
这里是Boon项目链接:
https://github.com/RichardHightower/boon
现在让我们继续进行切片操作!
我们可以使用以下代码查找以'o'开头的第一个水果:
idx(set, "o")
这里是之前我们创建的水果集合(使用TreeSet,其中包含“apple”,“kiwi”,“oranges”,“pears”和“pineapple”)。
assertEquals(
"oranges", idx(set, "o")
);
我们找到了橙子!
这次我们在寻找以“p”开头的水果,即 idx(set, "p")。
assertEquals(
"pears",
idx(set, "p")
);
是的!我们找到了梨!
那么以“pi”开头的水果如“菠萝”怎么样 - idx(set, "pi")
assertEquals(
"pineapple",
idx(set, "pi")
);
你也可以查询一个元素的下一个元素。"pi"后面是什么?
after(set, "pi")
assertEquals(
"pineapple",
after(set, "pi")
);
“菠萝”是在“pi”项目之后。顺便说一下,after和idx是相同的。那么为什么我要添加一个after呢?这样我就可以有一个before!!! :) 如果想知道“pi”之前是什么,该怎么办?使用
before(set, "pi")函数。
assertEquals(
"pears",
before(set, "pi")
);
请问所有介于“ap”和“o”之间的水果怎么样?正如我所承诺的那样,这里有切片符号!
slc(set, "ap", "o")
assertEquals(
sortedSet("apple", "kiwi"),
slc(set, "ap", "o")
);
"o"之后的所有水果怎么样?
slc(set, "o")
assertEquals(
sortedSet("apple", "kiwi"),
slc(set, "o")
);
所以,字母“o”之后的所有水果是“苹果”和“猕猴桃”。
那么,“o”之前的所有水果呢?(slcEnd将其解读为我正在切掉末尾。)
slcEnd(set, "o")
assertEquals(
sortedSet("oranges", "pears", "pineapple"),
slcEnd(set, "o")
);
所以所有的水果包括“o”在内都是“橙子”,“梨子”和“菠萝”。
类似列表的安全切片
如果索引超出范围,这些运算符会抛出异常:
使用Boon的Java切片表示法如下:
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
zlc代表零容忍切片
ix代表零容忍索引
zlcEnd代表零容忍结束切片。
copy代表复制,当然。
男孩和女孩们...记得始终对你不了解的对象执行安全切片。
也适用于基元类型,因此没有自动装箱
索引原语
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)
);
方法len和idx是通用运算符,可用于列表、数组、集合、映射等。
len给出类似数组、类似列表、类似映射的东西的长度。
idx给出类似数组、类似列表、类似映射的东西中位置为“索引”的项。
HOME MC字符串切片!
以下是Boon Java字符串切片的一些示例。
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");
另一种表达 idx(letters, -1) == 'd' 的方式是 idx(letters, letters.length() - 1) == 'd'!我更喜欢更简短的方式!
worked &=
idx(letters, letters.length() - 1) == 'd'
|| die("another way to express what the -1 means");
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");
切片,切片,宝贝!
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!");
我开着我的5.0跑车,敞开车顶让头发飘扬!剁剁宝贝!!!
string_sample[3]
代表什么意思? - Marounleft
、mid
和right
函数比基于负索引的切片函数更像Java(Java中的Pythonic是什么?)。 - abarnert