当前位置: 首页 > 知识库问答 >
问题:

为什么String []给定不同的长度,并对给定的字符串进行拆分?

田俊爽
2023-03-14

我有示例字符串,例如:

数据Management_Commercial信息管理系统

数据管理_非结构化数据管理(文本文档、纸质表格等。)

我通过< code>input-move-boxes从jsp页面传递字符串。所以在jsp页面中我有:

List<KeyValuePair> leftDataManagementList = new ArrayList<KeyValuePair>();
List<KeyValuePair> rightDataManagementList = new ArrayList<KeyValuePair>();
rightDataManagementList.add(new KeyValuePair(attribute.getAttributeListName()+"_"+attribute.getAttributeListValue(), attribute.getAttributeListValue()));
leftDataManagementList.add(new KeyValuePair(attributeMaster.getAttributeListName()+"_"+attributeMaster.getAttributeListValue(), attributeMaster.getAttributeListValue()));

这种情况下的< code >输入移动框是

<liferay-ui:input-move-boxes
            leftBoxName="availabledm"
            leftTitle="Data Management Available"
            leftList="<%=leftDataManagementList %>"
            rightBoxName="selecteddm"
            rightTitle="Data Management Selected"
            rightList="<%= rightDataManagementList%>"     
        />

在java类中,这些在< code>String[] selecteddm变量中检索。

String[] selecteddm = ParamUtil.getParameterValues(request, "selecteddm");

但我一次传一根绳子。因此,当我在变量中存储第一个字符串<code>Data Management_Commercial IMS(信息管理系统)</code>时。我得到了预期的结果。

System.out.println("Length:" +selecteddm.length);//Length:1
System.out.println(Arrays.toString(selecteddm));//[Data Management_Commercial IMS (Information Management System)]

int count = 0;
for(String str:selecteddm){
     System.out.println(str);//Data Management_Commercial IMS (Information Management System)
     System.out.println(count++);//0
}

现在我得到了第二个字符串< code >数据管理_非结构化数据管理(文本文档、纸质表单等)的问题。),因为它在逗号后拆分成单独的字符串。在这种情况下,

System.out.println("Length:" +selecteddm.length);//Length:3

//This print seems fine
System.out.println(Arrays.toString(selecteddm));//[Data Management_Non-structured Data Management (Text Documents, Paper Forms, etc.)]

int count = 0;
for(String str:selecteddm){
   System.out.println(str);
   System.out.println(count++);
}

这种情况下的循环打印:

Data Management_Non-structured Data Management (Text Documents
0
Paper Forms
1
etc.)
2

这到底是为什么?因此,第二种情况下字符串上的< code > str . split(" _ "[1]会生成< code > ArrayIndexOutOfBoundsException 。我如何避免这种情况,并使它像第一种情况下的字符串一样工作?

这和这个bug有关吗?https://issues.liferay.com/browse/LPS-42949

共有1个答案

姚鹤龄
2023-03-14

编辑:阅读更新后披露使用生命力

问题的根源在于您从表单传递显示标签,而不是用于标识它们的键。您应该改为按键传递表单选择,如下所示:

List<User> userList = ...
List leftList = new ArrayList();
List rightList = new ArrayList();
for (int k = 0; k < userList.size(); k++) {
    User user = (User) userList.get(k);
    leftList.add(new KeyValuePair(String.valueOf(user.getUserId()), user.getScreenName()));
}

向用户显示KeyValuePair的第二个参数,第一个参数是作为单个逗号分隔的请求参数的一部分发送的键(包含所选项目的所有键)。您应该基于键而不是显示标签来识别选择。

ParamUtil.getParameterValues最终将值拆分为“,”。这解释了你看到的行为。

顺便说一下:在最新的Liferay版本中,这个漏洞LPS-42949似乎已经修复。无论如何,这不是你问题的原因。

 类似资料:
  • 在这种情况下,字符串文本存储在只读存储器中。 在这种情况下,字符串文本存储在可写内存中。 为什么分配的内存与两个字符串文字有差异?

  • 本文向大家介绍Python生成给定长度的随机字符串,包括了Python生成给定长度的随机字符串的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将看到如何生成具有给定长度的随机字符串。这在创建需要随机性的随机密码或其他程序时很有用。 random.choices 随机模块中的choices函数可以产生字符串,然后可以将其连接以创建给定长度的字符串。 示例 输出结果 运行上面的代码给我们以下结

  • 问题内容: 我有一张表,其中包含一列以可变长度定界的字符串,例如: 20,0,5 ,, ^ 24,0,0 ,, ^ 26,0,0 ,, ^ 281,0,0 ,, ^ 34,0,2 ,, ^ 48,0,2 ,, ^ 44, 0,2 ,, ^ 20,0,10 ,, ^ 20,5,5 ,, ^ 379,1,1 ,, ^ 26,1,2 ,, ^ 32,0,1 ,, ^ 71,0, 2,^ 我需要做的是拆分

  • 我已经解决了寻找最长回文子字符串的问题,但这是不同的。给定一个像“ababa”这样的字符串,所有前缀的最长回文子字符串的长度如下所示- “a”:“a”(长度1) “ab”:“a”或“b”(长度1) “aba”:“aba”(长度3) “abab”:“aba”或“bab”(长度3) “亚贝巴”:“亚贝巴”(长度5) null null 我们只需要长度,而不是实际的回文。有没有更容易/更好(就运行时复杂

  • 我有一个很长的问题。我想用Python把它分成几行。在JavaScript中实现这一点的一种方法是使用几个句子,并用操作符将它们连接起来(我知道,这可能不是最有效的方法,但我并不真正关心这一阶段的性能,只关心代码的可读性)。例子: 我试着用Python做类似的事情,但没有成功,所以我用来拆分长字符串。然而,我不确定这是否是唯一/最好/最好的方法。看起来很尴尬。实际代码:

  • 我是打字新手。我正在使用Express、Node和Typescript进行备份。我有一个具有类型的对象: 我正在创建一个新的水果实例,从JSON文件中重新创建水果类型并填充它 这会产生一个错误。我知道我得到这个错误是因为我分配了一个未知字符串而不是Enum值。我假设解决方案是在将水果类型指定给FruitType对象之前,以某种方式检查水果类型是否为其中一个值。如何修复此错误?