根据其自然顺序获取下一个字符串

时间:2010-08-26 17:58:10

标签: java string

在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中是非法的,有换行符或类似的“有问题”的字符。)

3 个答案:

答案 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中从slow的所有字符串,包括:

high
     

类似的技术可用于生成开放范围(其中既不包含端点)。以下习语获取的视图包含SortedSet<String> sub = s.subSet(low, high+"\0"); 中从slow的所有字符串,不包括:

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";
      }
    }

  }
}

显然,可能会有错误因为我只是在回家的路上用手机输入了这个...