您当前的位置: 首页 >  Java

星拱北辰

暂无认证

  • 0浏览

    0关注

    1205博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

星拱北辰 发布时间:2019-12-10 02:08:06 ,浏览量:0

下面是核心内容

响应并处理选中的结点:

        // 设置节点选中监听器
        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 readList(DefaultMutableTreeNode target) {
        DiseaseType node = (DiseaseType)target.getUserObject();
        List patientInfoSet = node.getPatientSet();
        return patientInfoSet;
    }

    /**
     * 查询文件,在选中某结点以后查询出所有的患者并建立二维数组(JTable的Model)
     * @param patientInfoSet
     * @return
     */
    public Object[][] showPatients(List 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 list) {
        Collections.sort(list, new Comparator(){
            /*
             * 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 list) {
        Collections.sort(list, new Comparator(){
            /*
             * 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 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()  start && 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  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)  start && 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             
关注
打赏
1660750074
查看更多评论
0.0568s