Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:将大字符串转换为较小固定长度字符串的简单方法_Java_String_Oracle - Fatal编程技术网

Java:将大字符串转换为较小固定长度字符串的简单方法

Java:将大字符串转换为较小固定长度字符串的简单方法,java,string,oracle,Java,String,Oracle,我正在处理一个需要比较JSON对象内容的问题,我必须对许多记录重复这样做。我不能进行苹果对苹果的比较,因为我必须跳过几个字段进行比较,而且数组中的数据可能有不同的顺序 对于Ex,以下JSON被认为具有相同的内容,即使它们具有相同的内容 不同的“id”值 “利益”中不同的价值顺序 数组 Json1: { "id":1, "name":"John", "dept":"HR", "interests":["Reading","Cycling"] } { "id":5, "name":"John"

我正在处理一个需要比较JSON对象内容的问题,我必须对许多记录重复这样做。我不能进行苹果对苹果的比较,因为我必须跳过几个字段进行比较,而且数组中的数据可能有不同的顺序

对于Ex,以下JSON被认为具有相同的内容,即使它们具有相同的内容

  • 不同的“id”值
  • “利益”中不同的价值顺序 数组
Json1:

{
"id":1,
"name":"John",
"dept":"HR",
"interests":["Reading","Cycling"]
}
{
"id":5,
"name":"John",
"dept":"HR",
"interests":["Cycling","Reading"]
}
Json2:

{
"id":1,
"name":"John",
"dept":"HR",
"interests":["Reading","Cycling"]
}
{
"id":5,
"name":"John",
"dept":"HR",
"interests":["Cycling","Reading"]
}
我们的计划是创建一个表,并将比较逻辑移植到数据库查询。这些数据稍后将用于执行其他一些操作

  • id编号(10)
  • nameVARCHAR(256)
  • deptVARCHAR(256)
  • 兴趣VARCHAR(256)
映射到数据库列(id、name、dept)的字段适合直接查询。兴趣值可以增长并且是动态的,我想写一个方法来使用“兴趣”数组中的值生成一个唯一的字符串,这样我就不必将整个字符串存储到表中

我将调用方法生成字符串,作为兴趣列的值填充并插入到表中,同时查询时,我将使用相同的方法填充查询参数

注意:我的JSON有几个更复杂的对象,为了简化起见,我使用了简单的JSON。

您希望以某种方式将长字符串存储在短(er)空间中。策略取决于您的需要。需要考虑的几件事:

  • 是否需要为字段编制索引(以便基于此执行
    选择
  • 是否需要比较字符串是否相等?如果是,假阳性是否可以接受
你有几个选择,都有利弊

适当的一对多关系引用 如前所述,正确的方法是规范化引用。因此,一个包含
(id,interest)
元组的表和另一个包含
(data id,interest id)
引用的表将确保不会丢失信息

截断字符串 例如,18个字符:

The quick brown fox jumps over the lazy dog -> The quick brown fo
The quick brown fox jumps over the fence    -> The quick brown fo
当结果长度小于输入字符串时,截断将导致信息丢失。这可能是问题,也可能不是问题。根据输入字符串的不同,可以从输入的任意一端(实际上是任何地方)进行截断

散列字符串 例如:

同样,这会导致信息丢失:

  • 哈希冲突,因为输出空间(大小取决于算法)小于输入空间(实际上是无限的)
  • 哈希是一种单向操作
  • 然而,如果你能承受假阳性的风险,这可能是可行的。正如@HansKesting在评论中提到的,在散列(顺序、大小写)之前,请确保规范化数组值。此策略的重要特性是散列长度是固定的

    压缩字符串 例如:

    敏捷的棕色狐狸跳过懒狗eJwLyUhVKCzNTM5WSCrKL89TSMuvUMgqzS0oVsgvSy1SKAFK5yRWVSqk5KcDAFvcD9o=
    敏捷的棕色狐狸跳过篱笆eJwLyUhVKCzNTM5WSCrKL89TSMuvUMgqzS0oVsgvSy1SKAFKp6XmJacCAC1yDsE=
    
    压缩字符串使您有机会将字符串解压缩回其原始形式。缺点是输出长度是可变的和未知的,并且某些类型的输入比其他类型的输入更适合压缩



    总之,从您的问题和评论中可以看出,只有“适当的”关系方式似乎是正确的,但哈希可能是可行的。

    到目前为止您尝试了什么?您好,欢迎使用SO。现在还不完全清楚你想在这里实现什么。您希望将字符串存储为固定长度。如果您愿意牺牲信息,您可以简单地截断文本(即按所需长度剪切文本)或计算散列。如果没有,您可能能够在某种程度上压缩字符串,但此解决方案将无法处理无限的字符串。那么,问题是什么,您已经尝试了什么?当然,您可以尝试删除字符串,但它(1)对性能的影响可能比CLOB更大,(2)对随机格式的字符串的影响不大。“正确”的方法是将每个“兴趣”单独存储在链接表中。或者,您可以对兴趣列表中的值进行排序,以便始终存储“循环阅读”。兴趣“[“循环”]”或“[“循环”、“阅读”、“风筝”]”是否适合您?