日期:2014-05-20  浏览次数:20762 次

TreeMap
1. 人员名单重建问题
有文件“人员名单.txt”,其记录可能如下(可以参看考生文件夹下该文件的内容):
李爱华,北京
张立,吉林
吴祖含,上海
张颖,河北
李文虎,北京
许林,湖南
赵平复,河北
唐笑,北京
刘小明,河北
董其云,北京
对程序的要求是:读入该文件,变换后,输出文件“人员名单2.txt”。
要求在新的文件中,以省份(或直辖市)为依据分类。先输出省份,再输出该省份的人员数量,接下来是该省份人员列表。不同省份记录间用空行分隔。
省份间的先后次序可以不考虑。
同一省份的人员必须要按姓名的拼音序进行排列。
如上的“人员名单.txt”文件,重新整理后的输出文件“人员名单2.txt”内容应该为:
北京
4
董其云

我的代码如下:

import java.io.*;
import java.util.*;
class Student implements Comparable<Student>
{
private String name;
private String adress;
static TreeMap<Student ,Integer> map=new TreeMap<Student ,Integer>();
Student()
{

}
public String getAdress() {
return adress;
}
public void setAdress(String adress) {
this.adress = adress;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

Student(String name,String adress)
{
this.name=name;
this.adress=adress;
}
public void myPut(Student s,int n)
{
map.put(s, n);


}
public void myGet()
{
Set <Student>keySet=map.keySet();
Iterator<Student> it=keySet.iterator();
Student st=it.next();
System.out.println(st.adress);
System.out.println(st.name);
while(it.hasNext())
{
Student s=it.next();
if(s.adress.equals(st.adress))
{
System.out.println(s.name);
}
else
{
st=s;
System.out.println();
System.out.println(s.adress);
System.out.println(s.name);
}

}
}
public boolean equals(Object obj)
{
if(!(obj instanceof Student))throw new RuntimeException("运行异常");
Student s=(Student) obj;
int n=this.getName().compareTo(s.getName());
if(n==0)return this.adress.equals(s.adress);
return this.name.equals(s.name);
}
public int hashCode()
{
return this.name.hashCode()+adress.hashCode();
}
public String toString()
{
return this.name+" "+this.adress;
}
public int compareTo(Student arg0) {
int n=this.adress.compareTo(arg0.adress);
if(n==0) 
{
return this.name.compareTo(arg0.name);
}
return n;
}
}
class ReadTxt
{
private Student stu=new Student();
public void read()
{
FileReader fr=null;
BufferedReader br=null;

try
{
fr=new FileReader("E:\\大赛题\\java-辅导资料\\Java其它参考资料\\编程大题\\人员名单重建问题\\人员名单.txt");
br=new BufferedReader(fr);
String s=null;
String str[]=new String[2];
int i=0;
while((s=br.readLine())!=null)
{
str=s.split(",");
stu=new Student(str[0],str[1]);
stu.myPut(stu,i);
i++;

}
stu.myGet();
 
 

}
catch(Exception e)
{
e.getStackTrace();
}
finally
{
try
{
br.close();
fr.close();
}catch(Exception e)
{

}
}
}
}
public class Demo {
public static void main(String[] args) {
ReadTxt rt=new ReadTxt();
rt.read();

}

}

运行结果如下:
上海
吴祖含

北京
唐笑
李文虎
李爱华
董其云

吉林
张立

河北
刘小明
张颖
赵平复

湖南
许林

请问:为什么没有实现按地址及姓名排序,实现后 怎么统计该省份的人员数量

------解决方案--------------------
Java code

liaihua beijing
zhangling jiling
wuzhuhan shanghai
zhangying hebei
liwenhu beijing
xuling hunan
zhaopingfu hebie
tangxiao beijing
liuxiangming hebei
dongqiyun beijing
{beijing=[dongqiyun, liaihua, liwenhu, tangxiao], hebei=[liuxiangming, zhangying], hebie=[zhaopingfu], hunan=[xuling], jiling=[zhangling], shanghai=[wuzhuhan]}