如何在JList中组合2个向量?

时间:2011-02-22 17:27:07

标签: java vector jlist

Vector<String> totalProducts = Products.getProductNames();
Vector<String> selectedProducts = Products.getSelectedProductNames();

selectedProducts 向量是 totalProducts 的子向量(意味着 selectedProducts 包含 totalProducts中的一个,多个或所有元素)。我想要的是组合这两个向量并制作一个 JList ,其中包含totalProducts中的所有元素,以及已选择选择的selectedProducts元素。

我尝试了什么:

    Vector<Integer> indices = new Vector<Integer>();
    JList prdList = new JList(totalProducts);
    for(int i = 0; i < totalProducts.size(); i++)
    {
        for(String name : selectedProducts)
        {
            if(totalProducts.contains(name)) indices.add(i);
        }
    }
    Object [] objIndices = indices.toArray();
    //... Cast from Object [] to int [] ....
    prdList.setSelectedIndices(intIndices);

...但是这会选择最终JList中的所有元素。

以前我试过:

    JList prdList = new JList(totalProducts);
    for(String tName : totalProducts)
    {
        for(String sName : selectedProducts)
        {
            if(totalProducts.contains(sName)) prdList.setSelectedValue(sName, false);
        }
    }

...但是这个只选择了selectedProducts中的最后一个元素。

你能帮我做好吗?

2 个答案:

答案 0 :(得分:1)

在调试你的第一次尝试时(看起来它应该工作,你的intIndices数组的内容是什么?因为它看起来应该有效,假设你的数组转换有效。

但是,由于保证selectedproducts项目的总数少于总数,因此您可能希望迭代它而不是?

List<Integer> indices = new ArrayList<Integer>(selectedProducts.size());    
for(String name : selectedProducts)
{
    int index = totalProducts.indexOf(name);
    if (index != -1)
        indices.add(index);        
}

虽然,因为indexOf是一个列表的线性搜索,所以它可能无论如何都没有太大的区别。

对于您的第二次尝试,ListSelectionModel具有添加所选索引(addSelectionInterval(int index0, int index1))的方法 ,你正在使用设置(覆盖)选择的那个。

请参阅http://download.oracle.com/javase/6/docs/api/javax/swing/ListSelectionModel.html

除此之外:您可能希望使用List<>而不是Vector<>,因为向量会有很多不必要的同步开销。除非你需要同步....

编辑固定复制+粘贴add(i)with add(index)

答案 1 :(得分:1)

您选择所有项目的尝试是这样做的,因为您正在迭代每个项目,并且如果来自selectedProducts列表的任何项目在总列表中,则将迭代项目的索引添加到最终选择中名单。尝试将循环更改为以下内容:

for(int i = 0; i < totalProducts.size(); i++)
{
    String name = totalProducts.get(i);
    if(selectedProducts.contains(name)) indices.add(i);
}