java例题:从文件中读取对象属性并装入集合排序

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

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值