在Set Java中访问数据

时间:2014-04-21 04:24:52

标签: java set hashset treeset

我通过Scanner从.txt文件访问数据,.txt文件如下所示:

001 City     5000.00 101
002 Capital  4000.00 101
003 Farm     1000.00 102

我需要像这样重新格式化:

Capital
City
Farm

101 9000.00
102 1000.00

My Code Sor Far:

try{
      Scanner scan = new Scanner(new File("C:\\Users\\Dustin\\Desktop\\test.txt"));
      String[] strArray = new String[3];
      TreeSet<String> ts = new TreeSet<String>(); 
      while(scan.hasNextLine()){
          ts.add(scan.nextLine());
          //strArray[0] = scan.nextLine();
          //StringTokenizer stkn = new StringTokenizer(strArray[0],",");
          //System.out.println(stkn.nextElement());
          //System.out.println(strArray[0]);
      }
      for(String s : ts){
      System.out.println(s);
      }catch(Exception e){
       System.out.println("Error: "+e.getMessage());
}

但我不知道如何访问这些数据的各个项目并添加到集合中,然后将这101个项目添加到一起。我对此很新,任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

您可以尝试执行以下操作:

从文本文件中读取数据并使用.split(String regex)方法将其拆分:

try{
      Scanner scan = new Scanner(new File("C:\\Users\\Dustin\\Desktop\\test.txt"));
      TreeSet<String> ts = new TreeSet<String>();
      while(scan.hasNextLine()){
          String[] strArray = scan.nextLine().split("\\s+");    //the will yield an array having {"001", "City", "5000.00", "101"}

由于您希望按ID进行分组,因此您可以查看HashMap并添加以下行:Map<String, Double> map = new HashMap<String, Double>();

TreeSet<String> ts = new TreeSet<String>();
Map<String, Double> map = new HashMap<String, Double>()

当您从文件中读取数据时,您将检查是否已读取具有相同ID的值:

if(map.containsKey(strArray[3]))
{
    map.put(strArray[3], map.get(strArray[3]) + Double.parseDouble(strArray[2].trim()));
}
else
{
    map.put(strArray[3], Double.parseDouble(strArray[2].trim());
}

并将数据添加到您的设置中:

ts.add(strArray[1]);

一旦准备就绪,您将需要遍历该集合,然后打印其内容。完成后,您将需要迭代地图并打印键值对。

话虽如此,由于两种数据结构都不适合订购,我建议您为了清晰起见而在树集中包含值的ID:

ts.add(strArray[1] + "(" + strArray[4] + ")");

答案 1 :(得分:0)

对于您的情况,首先阅读文件的每一行,然后将其传递给一个对象(我称之为MyRecord):

Scanner scan = new Scanner(new File("C:\\test.txt"));
              TreeSet<String> ts = new TreeSet<String>(); 
              while(scan.hasNextLine()){
                  ts.add(scan.nextLine());
              }
              ArrayList<MyRecord> records = new ArrayList<MyRecord>();
              for(String s : ts){
                  System.out.println(s);
                  StringTokenizer st = new StringTokenizer(s," ");
                      MyRecord record = new MyRecord();
                      record.setOrder(st.nextElement().toString());//001 
                      record.setName(st.nextElement().toString());//City
                      record.setNumber(st.nextElement().toString());//5000.00
                      record.setGroup(st.nextElement().toString());//101
                      System.out.println(record.toString());
                      records.add(record);
              }

之后,你有一个包含许多MyRecord的ArrayList,每个MyRecord都是文件中的一行 循环使用此ArrayList,您就可以满足您的要求 由你自己做其余的事。如果问题 - &gt;评论&lt; - 我会支持。

class MyRecord{
    String order, name, group, number;
    //when calculate number, you need to convert number to number type such as long, double, etc
    public String getOrder() {
        return order;
    }
    public void setOrder(String order) {
        this.order = order;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGroup() {
        return group;
    }
    public void setGroup(String group) {
        this.group = group;
    }
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "order: " + order + "| name:" + name + "| number:" + number +"| group" + group;
    }

}