java 例题:从文件中读取对象属性,并存入集合排序(java的reflex机制)
题目说明:
读取第一行内容解析为n个User对象并存入集合
使用第二行内容使用内容中逗号左边的属性对user对象进行升序排序,如果该属性相等,则使用逗号右边的属性进行降序排序
文件(test.txt):
age=26,username=aay;username=kl,age=20;username=hpc,age=25;username=jay,age=66;username=jay,age=22
username,age
注意:属性数据格式:属性名=属性值 (同一个对象内的属性使用 “,” 隔开,不同对象使用 “;” 隔开)
User类
public class User {
private String username;
private int age;
public User(String username, int age) {
this.username = username;
this.age = age;
}
public User() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [username=" + username + ", age=" + age + "]";
}
}
实现类
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Comparator;
public class Test_3 {
public static void main(String[] args) throws IOException, NoSuchFieldException, SecurityException, Exception{
/**
* 读取第一行内容解析为n个User对象并存入集合
* 使用第二行内容使用内容中逗号左边的属性对user对象进行升序排序,如果该属性相等,则使用逗号右边的属性进行降序排序
*/
//创建带缓冲区的字符流
BufferedReader br = new BufferedReader(new FileReader("test.txt"));
//创建集合list
ArrayList<User> list = new ArrayList<>();
//定义接受文件信息的字符串
String str1;
String str2;
str1=br.readLine();
str2=br.readLine();
//关闭流资源
br.close();
//创建User类的字节码文件对象
Class<?> c=User.class;
//解析文件字符
String[] split = str1.split(";");
for (String string : split) {
String[] split2 = string.split(",");
//创建存放属性和值的string数组
String [] fieldAndValue ={null,null};
//创建User无参对象。
User user = new User();
for (String string2 : split2) {
fieldAndValue = string2.split("=");
Field field = c.getDeclaredField(fieldAndValue[0]);
field.setAccessible(true);
if(field.get(user) instanceof Integer)
field.set(user,Integer.valueOf(fieldAndValue[1]) );
else
field.set(user, fieldAndValue[1]);
}
list.add(user);
}
//输出排序前的list集合
for (User user : list) {
System.out.println(user);
}
String[] split2 = str2.split(",");
Field field1 = c.getDeclaredField(split2[0]);
Field field2 = c.getDeclaredField(split2[1]);
field1.setAccessible(true);
field2.setAccessible(true);
list.sort(new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
try {
Object left1 = field1.get(o1);
Object left2 = field1.get(o2);
Object right1 = field2.get(o1);
Object right2 = field2.get(o2);
if(Compare(left1, left2)==0)
return Compare(right2, right1);
else
return Compare(left1, left2);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return 0;
}
});
//输出排序后的list集合
System.out.println("-----------");
for (User user : list) {
System.out.println(user);
}
}
//比较方法
public static int Compare(Object o1,Object o2){
if(o1 instanceof Integer && o2 instanceof Integer){
int a = (int)o1;
int b = (int)o2;
return a-b;
}
if(o1 instanceof String && o2 instanceof String){
String a = (String )o1;
String b = (String )o2;
return a.compareTo(b);
}
return 0;
}
}