我通过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个项目添加到一起。我对此很新,任何帮助都会受到赞赏。
答案 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;
}
}