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

时间:2015-04-09 08:19:25

标签: java arrays string

我有样本字符串,如:

  

数据管理_商业IMS(信息管理系统)

     

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

我通过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()));

在这种情况下input-move-box

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

在java类中,这些是在String[] selecteddm变量中检索的。

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

但我一次传递一个字符串。 所以当我将第一个字符串Data Management_Commercial IMS (Information Management System)存储在变量中时。我得到了预期的结果。

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
}

现在我遇到第二个字符串Data Management_Non-structured Data Management (Text Documents, Paper Forms, etc.)的问题,因为它在逗号后分成单独的字符串。在这种情况下,

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

为什么会发生这种情况?因此,第二种情况下字符串上的str.split("_")[1]会生成ArrayIndexOutOfBoundsException。我怎样才能避免这种情况并使其在第一种情况下像字符串一样工作?

是否与此错误有关? https://issues.liferay.com/browse/LPS-42949

1 个答案:

答案 0 :(得分:1)

编辑:阅读更新后披露使用Liferay

问题的根源在于您从表单传递显示标签而不是键来识别它们。您应该按键传递表单选择,例如this

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最终将值拆分为&#34;,&#34;。这解释了您所看到的行为。

BTW:LPS-42949的错误似乎已在最新的Liferay版本中修复。无论如何,这不是你问题的原因。