gpt4 book ai didi

java - 我怎样才能构建一个比较器,以与 PostgreSQL 相同的方式对字符串进行排序?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:11:06 27 4
gpt4 key购买 nike

我正在编写一个集成测试,它将复杂的 order by 传递给 PostgreSQL,然后检查数据是否以正确的顺序返回。我正在用 Java 编写这个集成测试,它的 String.compareTo 方法似乎以不同于 PostgreSQL 的方式对事物进行排序。我在我的 PostgreSQL 数据库上运行了这个:

SELECT regexp_split_to_table('D d a A c b', ' ') ORDER BY 1;

它的回应是这样的:

a
A
b
c
d
D

然后我创建了这个单元测试以将其与 Java 排序方式进行比较:

import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import org.junit.Test;

import java.util.List;

import static junit.framework.Assert.assertEquals;

public class PostgresqlSortOrderTest {

@Test
public void whenJavaSortsStringsThenItIsTheSameAsWhenPostgresqlSortsStrings() {
List<String> postgresqlOrder = Lists.newArrayList("a", "A", "b", "c", "d", "D");
Ordering<String> ordering = new Ordering<String>() {
@Override
public int compare(String left, String right) {

return left.compareTo(right);
}
};
List<String> javaOrdering = ordering.sortedCopy(postgresqlOrder);
assertEquals(postgresqlOrder, javaOrdering);
}

}

此输出失败:

Expected :[a, A, b, c, d, D]  //postgresql
Actual :[A, D, a, b, c, d] //java

我对这里的术语一窍不通。我想知道这些不同字符串类型的名称,以便更好地交流。但更重要的是,如何让 Java 像 PostgreSQL 那样进行排序?

最佳答案

晚了才显示答案,但我担心简单的不区分大小写的搜索不一定能满足您的需求。

您希望在搜索中使用的关键字是 collation (并且在更广泛的意义上 locales )和 PostgreSQL 依赖于底层操作系统为此提供支持。排序很少是简单的逐字符比较。例如,在许多语言环境中,空格会被忽略(在 en_GB 中确实如此)。

另外,这意味着您可以在不同的平台上使用不同的排序顺序(取决于 Apple 或 Microsoft 是否同意 Linus 对您所在国家/地区的默认排序)。

关于包含 BSD 许可的库以提供跨平台的一致顺序集是否有意义,已经进行了一些讨论。然而,这是一项大量的工作,意味着您最终可能会在数据库中与操作系统的其余部分进行不同的排序。尽管不同的提供商对如何处理此问题存在分歧,但恐怕没有一个简单的解决方案。

您可能想研究“传统”排序的“C”归类。恐怕我无法评论 Java 对正确语言环境排序的处理 - 这不是我的领域。

关于java - 我怎样才能构建一个比较器,以与 PostgreSQL 相同的方式对字符串进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20957596/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com