如何仅将 CSV 中的唯一值添加到 ComboBox 中?

2023-12-08

我想读取 csv 文件并将单词“Jakarta”和“Bandung”放入组合框中。这是输入

id,from,
1,Jakarta
2,Jakarta
5,Jakarta
6,Jakarta
10,Bandung
11,Bandung
12,Bandung

我设法获取这些单词并将其放入组合框中,但如您所见,文本文件本身包含很多单词“Jakarta”和“Bandung”,而我只想在组合框中显示这两个单词一次。

这是我的临时代码,目前有效,但效率低下,如果单词有更多变化,可能无法使用

public String location;

private void formWindowOpened(java.awt.event.WindowEvent evt) {

    String csvFile = "C:\\Users\\USER\\Desktop\\Project Data.csv";
    BufferedReader br = null;
    LineNumberReader reader = null;
    String line = "";
    String cvsSplitBy = "-|\\,";

        br = new BufferedReader(new FileReader(csvFile));
        reader = new LineNumberReader(new FileReader(csvFile));


        while ((line = br.readLine()) != null) {

            // use comma as separator

            String[] bookingdata = line.split(cvsSplitBy);

            location = bookingdata[1];
            ComboBoxModel model = cmb1.getModel();
            int size = model.getSize();

            cmb1.addItem(location);

            for(int i = 1; i < size; i++){

                if(model.getElementAt(i).equals("from")){
                    cmb1.removeItemAt(i);
                }

                else if(model.getElementAt(i).equals("Bandung")){
                    cmb1.removeItemAt(i);
                }


                for(int j = 2; j < i; j++){
                    if(model.getElementAt(j).equals("Jakarta")){
                        cmb1.removeItemAt(j);
                    }
                }
           }
       }
}

其他人推荐了这种方法

boolean isEquals = false;
for(i = 0; i < a && !isEquals; i++){
   isEquals = location.equals("Jakarta");
   if(isEquals){
      cmb1.addItem("Jakarta");
   }
}

这段代码不起作用。因为代码一旦添加“ Jakarta ”就不会停止,但它会在完成循环后停止。因此它仍然在组合框中创建重复项。

我想知道是否还有其他代码可以尝试。谢谢


尝试先将所有单词放入一个集合中,然后将其添加到组合框中。设置本身将处理每个单词的精确出现一次。

像这样的东西:

    while ((line = br.readLine()) != null) {

        // use comma as separator

        String[] bookingdata = line.split(cvsSplitBy);

        location = bookingdata[1];
        ComboBoxModel model = cmb1.getModel();
        int size = model.getSize();
        // add all location in set and set will only allow distinct values
        locationSet.add(location);

       }
       // after looping through all location put it in combobox
       for(String location:locationSet)cmb1.addItem(location);
   }
  }

正如评论中所讨论的,集合旨在保留唯一的值。 JShell的截图如下:

enter image description here

PS:这只是提供一个想法,可能需要根据要求进行一些修改。

--编辑--

正如所讨论的,看来你仍然遗漏了一些东西,我尝试编写下面的代码并且工作得很好

package com.digital.core;

import java.util.HashSet;
import java.util.Set;

import javax.swing.JComboBox;
import javax.swing.JFrame;

public class Test {

    public static void main(String[] args) {
       JFrame jframe = new JFrame();
       jframe.setSize(300, 300);
       String data = "id,from,\n" + 
            "1,Jakarta\n" + 
            "2,Jakarta\n" + 
            "5,Jakarta\n" + 
            "6,Jakarta\n" + 
            "10,Bandung\n" + 
            "11,Bandung\n" + 
            "12,Bandung";
       String[] dataArr = data.split("\n");

       Set<String> locationSet = new HashSet<>();
       for(String line:dataArr) {
           locationSet.add(line.split(",")[1]);
       }
       JComboBox<String> comboBox = new JComboBox<>();
       for(String location:locationSet)
       comboBox.addItem(location);
       jframe.add(comboBox);
       jframe.setVisible(true);


    }


}

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何仅将 CSV 中的唯一值添加到 ComboBox 中? 的相关文章

随机推荐