Java 获取字符串的上一个值和下一个值
我使用的是NoSQL数据库,它不允许投影属性的相等条件。例如,不合格操作,如Java 获取字符串的上一个值和下一个值,java,string,Java,String,我使用的是NoSQL数据库,它不允许投影属性的相等条件。例如,不合格操作,如从a>10的表中选择一个,并且允许从b > < /P> 以下每个字符串都位于“foo”下面,并且每个字符串都比最后一个字符串大 "fon" + Character.MAX_VALUE; "fon" + Character.MAX_VALUE + Character.MAX_VALUE; "fon" + Character.MAX_VALUE + Character.MAX_VALUE + Character.MAX_VA
从a>10的表中选择一个,并且允许从b<10的表中选择一个,但是从a=10的表中选择一个,这是不允许的。当然,我需要在我的例子中使用一个等式,所以我想把一个等式运算变成一个不等式运算
所以我需要通过电子邮件检索记录。如果可以,我会去从email='1'所在的表中选择emailmyemail@email.com“
,但这是不允许的,所以我想在myemail@email.com
和后面的值。因此,查询将如下所示:
select email from table where email < [1 value above] and email > [1 value below]
从表中选择电子邮件,其中电子邮件<[1上面的值]和电子邮件>[1下面的值]
这样,语句仍将返回myemail@email.com
。我有困难,但如何做到这一点
通常要比较字符串,我会选择“myemail@email.com“。比较(”myemail@email.ca”
查看哪个更大,哪个更小。这种方法以某种方式基于词典来比较值,但是如何比较呢?我的问题是如何获得字符串正下方的词典值和字符串正后方的词典值?字符串后面的字符串很简单。只是
str + '\0'
这是因为'\0'
是可能的最低char
值
紧靠str
前面的字符串更复杂。如果字符串以'\0'
结尾,则可以将其删除。如果字符串没有以'\0'
结尾,则会出现严重问题。举个例子,让我们考虑字符串<代码>“FO”< /C> > < /P>
以下每个字符串都位于“foo”
下面,并且每个字符串都比最后一个字符串大
"fon" + Character.MAX_VALUE;
"fon" + Character.MAX_VALUE + Character.MAX_VALUE;
"fon" + Character.MAX_VALUE + Character.MAX_VALUE + Character.MAX_VALUE;
...
小于“foo”
的最大字符串值是“fon”
,后面是2^31-4个字符副本。最大值
(这可能不对。我不确定char[]
的最大可能长度是多少)。但是,您将无法在内存中存储这样的字符串
因此,您应该尝试为您的问题找到不同的解决方案。字符串后面的字符串很容易。只是
str + '\0'
这是因为'\0'
是可能的最低char
值
紧靠str
前面的字符串更复杂。如果字符串以'\0'
结尾,则可以将其删除。如果字符串没有以'\0'
结尾,则会出现严重问题。举个例子,让我们考虑字符串<代码>“FO”< /C> > < /P>
以下每个字符串都位于“foo”
下面,并且每个字符串都比最后一个字符串大
"fon" + Character.MAX_VALUE;
"fon" + Character.MAX_VALUE + Character.MAX_VALUE;
"fon" + Character.MAX_VALUE + Character.MAX_VALUE + Character.MAX_VALUE;
...
小于“foo”
的最大字符串值是“fon”
,后面是2^31-4个字符副本。最大值
(这可能不对。我不确定char[]
的最大可能长度是多少)。但是,您将无法在内存中存储这样的字符串
因此,您应该尝试为您的问题找到不同的解决方案。假设您的字母表是a-z0-9
,并且不区分大小写,您可以将字符串视为基数为36的数字,只需使用简单的算术来增加/减少值
Java的方法允许您使用给定的基数获取字符串,并将其转换为(以10为基数)Long
等效值。一旦有了一个Long
实例,只需添加1即可获得下一个值
public static String nextString(String str) {
return Long.toString(Long.valueOf(norm(str), 36) + 1, 36);
}
要反转该操作,可以使用该方法,该方法将获取long
实例,并将其转换为具有指定基数的String
表示形式。因此,您可以将base-10long
表示为base-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]", "");
}
假设您的字母表是a-z0-9
,并且不区分大小写,您可以将字符串视为基数为36的数字,并使用简单的算术简单地递增/递减值
Java的方法允许您使用给定的基数获取字符串,并将其转换为(以10为基数)Long
等效值。一旦有了一个Long
实例,只需添加1即可获得下一个值
public static String nextString(String str) {
return Long.toString(Long.valueOf(norm(str), 36) + 1, 36);
}
要反转该操作,可以使用该方法,该方法将获取long
实例,并将其转换为具有指定基数的String
表示形式。因此,您可以将base-10long
表示为base-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]", "");
}
哪种奇怪的NoSQL支持
,但不支持=
?@Andreas Google数据存储-如果使用投影查询,则无法投影在相等筛选条件下使用的属性。NoSQL的这种神秘风格是否支持而不是操作符?为什么不直接从T中选择*而不是(email<:val或email>:val)
?那么请阅读所有其他值,除了您已经知道的值。或者不要使用投影,因为投影只返回值的子集。返回整个实体。我的意思是,更新需要整个实体,对吗?正如你所说:我必须拥有所有values@Andreas如果我聪明的话,我会这么做的,哈哈。我从来没有想过我已经知道我的代码中的这个值,我可以使用它。谢谢,现在我觉得自己很笨。什么样的奇怪的NoSQL支持<代码