【Java】对JTable里的元素进行排序

下面是核心内容

响应并处理选中的结点:

        // 设置节点选中监听器
        tree.addTreeSelectionListener(new TreeSelectionListener() {
            @Override
            public void valueChanged(TreeSelectionEvent e) {
                DefaultMutableTreeNode target = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
                list = controller.readList(target);
                tableData = controller.showPatients(list);
                tableModel.setDataVector(tableData, tableHeader);
            }
        });

因为我们知道DefaultTableModel里的数据存在二维数组里,所以我们可以将二维数组转成List再进行排序,List标定的泛型类型是实体类,确保重排的是整行数据。

将二维数组转成List

    public List<PatientInfo> readList(DefaultMutableTreeNode target) {
        DiseaseType node = (DiseaseType)target.getUserObject();
        List<PatientInfo> patientInfoSet = node.getPatientSet();
        return patientInfoSet;
    }

    /**
     * 查询文件,在选中某结点以后查询出所有的患者并建立二维数组(JTable的Model)
     * @param patientInfoSet
     * @return
     */
    public Object[][] showPatients(List<PatientInfo> patientInfoSet) {
        int size = patientInfoSet.size();
        Object[][] tableData = new Object[size][2];
        int i = 0;
        for (PatientInfo patient : patientInfoSet) {
            tableData[i][0] = patient.getId();
            tableData[i][1] = patient.getName();
            i++;
        }
        return tableData;
    }

按照ID排序

        JButton btnNewButton = new JButton("按ID排序");
        btnNewButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                controller.quickSortById(list, 0, list.size()-1);
                tableData = controller.showPatients(list);
                //System.out.println(tableData.length);
                tableModel.setDataVector(tableData, tableHeader);
            }
        });
        btnNewButton.setFont(new Font("黑体", Font.BOLD, 15));
        btnNewButton.setBounds(47, 27, 127, 27);
        panel.add(btnNewButton);

前端排序,按照需求不需要在后端修改:

    /**
     * 对查询到的数据进行排序(按照ID)
     * 排序在前端完成,不返回后台
     */
    public void sortById(List<PatientInfo> list) {
        Collections.sort(list, new Comparator<PatientInfo>(){
            /*
             * int compare(PatientInfo p1, PatientInfo p2) 返回一个基本类型的整型,
             * 返回负数表示:p1 小于p2,
             * 返回0 表示:p1和p2相等,
             * 返回正数表示:p1大于p2
             */
            public int compare(PatientInfo p1, PatientInfo p2) {
                //按照Person的ID进行升序排列
                if(p1.getId() > p2.getId()){
                    return 1;
                }
                if(p1.getId() == p2.getId()){
                    return 0;
                }
                return -1;
            }
        });
    }

按照Name排序:

        JButton button = new JButton("按姓名排序");
        button.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                controller.quickSortByName(list, 0, list.size()-1);
                tableData = controller.showPatients(list);
                //System.out.println(tableData.length);
                tableModel.setDataVector(tableData, tableHeader);
            }
        });
        button.setFont(new Font("黑体", Font.BOLD, 15));
        button.setBounds(234, 27, 127, 27);
        panel.add(button);

前端排序,按照需求不需要在后端修改:

    /**
     * 对查询到的数据进行排序(按照名字)
     * 排序在前端完成,不返回后台
     */
    public void sortByName(List<PatientInfo> list) {
        Collections.sort(list, new Comparator<PatientInfo>(){
            /*
             * int compare(PatientInfo p1, PatientInfo p2) 返回一个基本类型的整型,
             * 返回负数表示:p1 小于p2,
             * 返回0 表示:p1和p2相等,
             * 返回正数表示:p1大于p2
             */
            public int compare(PatientInfo p1, PatientInfo p2) {
                return (p1.getName()).compareTo(p2.getName());
            }
        });
    }

下面两个图就是点击两个JButton的效果:
在这里插入图片描述
在这里插入图片描述
但是内置的排序效率据说不会特别高,我们也可以自己写排序(快排):

    public void quickSortById(List<PatientInfo> list, int low, int high) {
        //start是list的第一位,end是list的最后一位,start和end都是list的下标;
        int start = low;
        int end = high;
        //key作为参考值,取未排序的list第一位key的首字母作为参考
        //下方的算法大体思路,就是拿list的第一位和key比较,排序,
        //key值前都比value小,key值后都比key大
        Integer key = list.get(low).getId();
        while (end > start) {
            //从后往前比较
            //list.get(end).getId()是list最后一个值的ID
            while (end > start && list.get(end).getId() >= key) {
                end--;
            }
            if (list.get(end).getId() <= key) {
                //此时list第一位和最后一位需要调换位置,先将list第一位的值保存起来
                PatientInfo keyStarts = list.get(start);
                //此处调换位置,使用list的set方法,由于第一位放入了最后一个值,
                //所以最后一位需要放入之前的第一位的值
                list.set(start, list.get(end));
                list.set(end, keyStarts);
            }
            //从前往后比较
            while (end > start && list.get(start).getId() <= key) {
                start++;
            }
            if (list.get(start).getId() >= key) {
                // 同理从后往前比较,需要将第一位的值先保存,方便调换
                PatientInfo keyStarts = list.get(start);
                list.set(start, list.get(end));
                list.set(end, keyStarts);
            }
            if (start > low) quickSortById(list, low, start - 1);
            if (end < high) quickSortById(list, end + 1, high);
        }
    }

    public void quickSortByName(List<PatientInfo> list, int low, int high) {
        //start是list的第一位,end是list的最后一位,start和end都是list的下标;
        int start = low;
        int end = high;
        //value作为参考值,取未排序的list第一位key的首字母作为参考
        //下方的算法大体思路,就是拿list的第一位和key比较,排序,
        //key值前都比key小,key值后都比value大
        String key = list.get(low).getName();
        while (end > start) {
            //从后往前比较
            //list.get(end).getId()是list最后一个值的ID
            while (end > start && list.get(end).getName().compareTo(key) >= 0) {
                end--;
            }
            if (list.get(end).getName().compareTo(key) <= 0) {
                //此时list第一位和最后一位需要调换位置,先将list第一位的值保存起来
                PatientInfo keyStarts = list.get(start);
                //此处调换位置,使用list的set方法,由于第一位放入了最后一个值,
                //所以最后一位需要放入之前的第一位的值
                list.set(start, list.get(end));
                list.set(end, keyStarts);
            }
            //从前往后比较
            while (end > start && list.get(end).getName().compareTo(key) <= 0) {
                start++;
            }
            if (list.get(end).getName().compareTo(key) >= 0) {
                // 同理从后往前比较,需要将第一位的值先保存,方便调换
                PatientInfo keyStarts = list.get(start);
                list.set(start, list.get(end));
                list.set(end, keyStarts);
            }
            if (start > low) quickSortByName(list, low, start - 1);
            if (end < high) quickSortByName(list, end + 1, high);
        }
    }
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星拱北辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值