2014-04-21 2 views
0

Я доступа к данным из текстового файла с помощью сканера, то .txt файл выглядит следующим образом:Доступ к данным в Set Java

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

мне это нужно, чтобы быть переформатирован так:

Capital 
City 
Farm 

101 9000.00 
102 1000.00 

Мой код Сор 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 это ems вместе. Я очень новичок в этом, любая помощь будет оценена.

+0

не может понять, как вы хотите отформатировать? –

+0

Мне нужно, чтобы данные из файла .txt, показанного выше, были переформатированы по типу свойства (City, Capital и т. Д.), А затем упорядочены идентификатором свойства (101, 102) и, если тот же идентификатор, добавьте сумму вместе – hexobolic

+0

, сначала вам нужно сканировать вход с помощью сканера. Затем обозначьте строку в токенах с помощью StringTokenizer. Соответственно, добавьте поля в категорию «Arraylist». Вы можете продолжить свою логику. –

ответ

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]); 

После того, что вы будете готовы, вам нужно будет перебрать набора, а затем, распечатать его содержимое. Как только вы это сделаете, вам нужно будет перебрать карту и распечатать пары ключ-значение.

Это, как говорится, так как ни одна структура данных обслуживает заказ, я рекомендовал бы включать корочки значений вы положили в вашем наборе дерева для ясности:

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

Большое спасибо npinti! По какому масштабу, если что-то еще происходит, на цикле while? И в какой объем добавляется ts? Я получаю ошибку выполнения «3» при компиляции. – hexobolic

+0

Это было исправлено из-за проблемы с пространством в .txt doc, как бы я пошел по итерации по набору, создав итератор или цикл? Как повторяются пары ключевых значений ключей? Еще раз спасибо за вашу помощь. – hexobolic

+0

@ user2723341: 'if else' нужно будет зайти в ваш цикл while. Чтобы перебирать множество (я предполагаю, что вы ссылаетесь на последний раздел моего ответа), вам просто нужно что-то сделать по линиям, которые вы уже делаете в конце вашего вопроса. – npinti

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); 
       } 

После этого, у вас есть ArrayList со многими MyRecord, каждый MyRecord является строка в файле
Loop в этом ArrayList, вы ab чтобы выполнить ваши требования.
Сделайте все остальное самостоятельно. Если проблема -> комментарий < - я буду поддерживать.

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; 
    } 

} 
+0

Спасибо вам за вашу помощь tana, я рассмотрю этот метод. Я очень ценю всю вашу работу. – hexobolic

Смежные вопросы