获取字符串的上一个和下一个值

时间:2016-04-08 22:53:47

标签: java string

我正在使用NoSQL数据库,该数据库不允许投射的属性的相等条件。例如,select a from table where a > 10等不等式操作被允许select a from table where b < 10,但不允许select a from table where a = 10。当然我需要在我的情况下使用相等,所以我想把一个相等的操作变成一个不等式操作。

所以我需要通过电子邮件检索记录。如果我可以select email from table where email = 'myemail@email.com',但是这是不允许的,所以我想在myemail@email.com之前获得字典值,然后在之后获得值。所以查询看起来像这样:

select email from table where email < [1 value above] and email > [1 value below]

这样语句仍会返回myemail@email.com。我虽然如何实现这个目标却遇到了麻烦。

通常比较字符串我去"myemail@email.com".compare("myemail@email.ca")看哪个更大,哪个更小。这种方法基于词典法以某种方式比较这些值,但是如何?我的问题是如何在字符串下方获取字典值,并在字符串后面插入字典值?

2 个答案:

答案 0 :(得分:1)

字符串后面的字符串很容易。它只是

str + '\0'

这是有效的,因为'\0'是最低char值。

str之前立即的字符串更棘手。如果字符串以'\0'结尾,则可以将其删除。如果字符串没有以'\0'结尾,那么您就会遇到严重问题。例如,我们考虑字符串"foo"

以下每个字符串均低于"foo",每个字符串都大于最后一个字符串。

"fon" + Character.MAX_VALUE;
"fon" + Character.MAX_VALUE + Character.MAX_VALUE;
"fon" + Character.MAX_VALUE + Character.MAX_VALUE + Character.MAX_VALUE;
...

String小于"foo"的最大值"fon"后面跟2^31 - 4 Character.MAX_VALUEchar[]一样(这可能不对。我&#39 ;我不确定pty的最大可能长度是多少。但是,您将无法将此类字符串存储在内存中。

因此,您应该尝试找到解决问题的不同方法。

答案 1 :(得分:1)

假设您的字母表为a-z0-9且不区分大小写,则可以将字符串视为base-36数字,并使用简单的算术简单地递增/递减值。

Java的Long.valueOf方法允许您获取具有给定基数的字符串,并将其转换为它(基数为10)Long等效字符串。获得Long实例后,只需添加1即可获得下一个值。

public static String nextString(String str) {
    return Long.toString(Long.valueOf(norm(str), 36) + 1, 36);
}

要反转操作,您可以使用Long.toString方法,该方法接受long实例并将其转换为具有指定基数的String表示形式。因此,您可以将基数10 long表示为基数为36的数字,其中包含字母a-z

public static String prevString(String str) {
    return Long.toString(Long.valueOf(norm(str), 36) - 1, 36);
}

您希望在使用这些方法时规范化字符串,因此这将过滤我们的无效字符,确保所有内容都是小写的,并防止空指针异常或数字格式异常。

private static String norm(String str) {
    if (str == null) {
        return "0";
    }
    return str.toLowerCase().replaceAll("[^a-z0-9]", "");
}