我正在使用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")
看哪个更大,哪个更小。这种方法基于词典法以某种方式比较这些值,但是如何?我的问题是如何在字符串下方获取字典值,并在字符串后面插入字典值?
答案 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_VALUE
份char[]
一样(这可能不对。我&#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]", "");
}