在Java中,String类实现了Comparable,这意味着String对象有一个总排序。这种排序被称为类的自然排序,而类的compareTo
方法被称为其自然比较方法。在数学意义上,String对象集也是可数的。
我需要一个带String的函数,并根据String的自然顺序返回下一个。
对于数学倾向,
function(X) = Y, where Y is such that: 1) X < Y
2) for all Z, if X < Z, then Y <= Z.
你能想到一个为Strings做这个的功能吗? (那些匹配^[A-Za-z0-9]+$
。我不在乎,但你可以避免控制字符或任何可能导致编码令人头疼,在XML中是非法的,有换行符或类似的“有问题”的字符。)
答案 0 :(得分:3)
String successor(String s) {
return s + '\0';
}
或者使用有限的字母表:
String successor(String s) {
return s + '0';
}
因为'0'具有所有合法字符的最小unicode值。
为什么你需要这个是任何人的猜测,但是...可能有一个不太讨厌的解决方案。
答案 1 :(得分:1)
正如另一个答案首先指出的那样,字符串的后继是紧跟着char
的字符串,其值为0
(在Java中,char
是无符号整数值,[0,65535]
(§4.2.1))。
// returns the lexicographical successor of a string
public static String successor(String s) {
return s + "\0";
}
SortedSet
文档的以下摘录为String
规定了这个确切的习惯用法,并给出了动机为什么你想要使用这样的后继方法:
注意:有几种方法返回具有受限范围的子集。这样的范围是半开,也就是说,它们包括它们的低端点但不包括它们的高端点(如果适用)。如果您需要封闭范围(包括两个端点),并且元素类型允许计算给定值的后继,则仅请求从
lowEndpoint
到{{1}的子范围}。例如,假设successor(highEndpoint)
是一组有序的字符串。以下习语获取的视图包含s
中从s
到low
的所有字符串,包括:high
类似的技术可用于生成开放范围(其中既不包含端点)。以下习语获取的视图包含
SortedSet<String> sub = s.subSet(low, high+"\0");
中从s
到low
的所有字符串,不包括:high
请注意,这个习惯用法仍然难以使用,并且计算任何泛型类型的后继者并不总是那么容易(例如,如果它只是SortedSet<String> sub = s.subSet(low+"\0", high);
)。更精确的API是NavigableSet<E>
,SortedSet<Number>
定义了这些范围操作,以允许使用extends SortedSet<E>
标记的任何开放或结束点组合。
答案 2 :(得分:0)
不确定为什么你会需要这样的东西......强行推出一些东西? 无论如何,这是一个非常原始的解决方案:
public static String getNextString(String input)
{
if(input == null || input.trim().length() < 1)
{
return("0");
}
else
{
String trimmed = input.trim();
int lastPos = input.length()-1;
int last = (int) input.charAt(lastPos);
last++;
if(last > (int) 'z')
{
if(lastPos == 0)
{
return "00";
}
else
{
return getNextString(trimmed.substring(0,lastPos-1)) + "0";
}
}
}
}
显然,可能会有错误因为我只是在回家的路上用手机输入了这个...