1

我使用这部分代码将 jlist 中的选择项获取到字符串列表中。我得到以下结果:

[[String1, String2, String3,...]]

如何避免双 []?谢谢

static List<String> strlist = new ArrayList<String>();

public class tog {

        List<String> strlisttemp = new ArrayList<String>();

        final JList list = new JList(strlisttemp.toArray());
        list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

        final ListSelectionListener listSelectionListener = new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {

                String lstr = list.getSelectedValuesList().toString();
            System.out.println(lstr);
                strlist = Arrays.asList(lstr.split("\\s*,\\s*"));

            }
        };

        list.addListSelectionListener(listSelectionListener);
        JOptionPane.showMessageDialog(null, list, "Select", JOptionPane.QUESTION_MESSAGE);

        System.out.println(strlist);

}

这是有问题的部分:当我打印 lstr 它工作正常[...]。当我使用这个时:

strlist = Arrays.asList(lstr.split("\\s*,\\s*"));

然后 System.out.println(strlist); 打印双括号

4

3 回答 3

2

您不必要地将返回的转换List为其原始String表示,将其拆分String为 a String[],然后将其转换String[]为 List。

相反,只需直接使用返回的 List 即可。

package com.example.list;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class ListExample {
    static List<String> strlist = new ArrayList<String>();

    public static void main(String[] args) {
        List<String> strlisttemp = new ArrayList<String>();
        strlisttemp.add("a");
        strlisttemp.add("b");
        strlisttemp.add("c");

        final JList list = new JList(strlisttemp.toArray());
        list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

        final ListSelectionListener listSelectionListener = new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {

                strlist = list.getSelectedValuesList(); // use this instead

//              String lstr = list.getSelectedValuesList().toString();
//              strlist = Arrays.asList(lstr.split("\\s*,\\s*"));

                System.out.println(strlist);
            }
        };

        list.addListSelectionListener(listSelectionListener);
        JOptionPane.showMessageDialog(null, list, "Select", JOptionPane.QUESTION_MESSAGE);


    }
}
于 2013-10-04T16:33:34.757 回答
2

当你调用List.toString它时,它会在结果周围加上括号。

所以你打电话list.getSelectedValuesList(),你正在检索一个List<String>. 你调用toString()这个给你"[a, b, c, d]"的。然后,您在逗号空间序列上拆分此字符串并获取"[a", "b", "c", "d]". 您将其放入另一个列表并调用toString()它并在其周围放置另一个括号。

它是双括号的,因为在第二个列表中,第一个条目是"[a",最后一个条目是"d]"!

于 2013-10-04T16:36:30.360 回答
1

这是为了回答您关于为什么要使用双方括号的问题。有关对此进行编码的更好方法,请参阅 rob 的答案。

String lstr = list.getSelectedValuesList().toString();

此时,lstr == "[aaa,bbb,ccc]"

strlist = Arrays.asList(lstr.split("\\s*,\\s*"));

现在,strlist 的第一个元素将以 '[' 开头,因为那是 lstr 的第一个字符,最后一个元素将以 ']' 结尾,因为那是 lstr 的最后一个字符。

现在,当你去打印 strlist

System.out.println(strlist);

Java 将隐式调用 list.toString(),它会在打印列表时附加一组方括号。由于列表中的第一个元素以方括号开头,最后一个元素以一个结尾,因此您最终得到的是开头和结尾的双括号

于 2013-10-04T16:39:02.170 回答