如何在Handler类中按行号对Table内的Rows集合进行排序
按行号对Rows数组排序的实现方案
针对你现有类结构,要按行号(Rows类的number字段)对选中的Rows集合排序,有两种简洁的实现方式,以下是具体方案:
方法一:使用Lambda表达式结合Collections.sort(无需修改Rows类)
直接在Handler类的sortRowsByNum方法中,先让用户选择要排序的Table,然后利用Comparator的Lambda表达式指定按行号排序逻辑:
import java.util.Collections; public void sortRowsByNum() { if (listT.isEmpty()) { System.out.println("没有可用的Table,请先创建Table!"); return; } System.out.println("选择要排序的Table编号:"); printT(); if (console.hasNextInt()) { int tableIndex = console.nextInt() - 1; // 转换为ArrayList的索引 if (tableIndex >= 0 && tableIndex < listT.size()) { Table targetTable = listT.get(tableIndex); // 按行号升序排序,若要降序则交换o1和o2的位置 Collections.sort(targetTable.rowsArrayList, (o1, o2) -> Integer.compare(o1.getNumber(), o2.getNumber())); System.out.println("排序完成!当前Table的行内容:"); for (Rows row : targetTable.rowsArrayList) { row.printRows(); } } else { System.out.println("输入的Table编号不存在!"); } } else { System.out.println("请输入有效的整数编号!"); } }
方法二:让Rows实现Comparable接口(全局默认排序规则)
如果希望Rows对象默认就按行号排序,可以修改Rows类实现Comparable<Rows>接口,重写compareTo方法:
修改后的Rows类
public class Rows implements Comparable<Rows> { private int number; private String data; private int numT; // 原有构造方法、getter/setter、printRows、toString方法保持不变 @Override public int compareTo(Rows other) { // 按行号升序排序,降序则返回other.number - this.number return Integer.compare(this.number, other.number); } }
对应的sortRowsByNum方法实现
此时排序逻辑更简洁,直接调用Collections.sort即可:
import java.util.Collections; public void sortRowsByNum() { if (listT.isEmpty()) { System.out.println("没有可用的Table,请先创建Table!"); return; } System.out.println("选择要排序的Table编号:"); printT(); if (console.hasNextInt()) { int tableIndex = console.nextInt() - 1; if (tableIndex >= 0 && tableIndex < listT.size()) { Table targetTable = listT.get(tableIndex); Collections.sort(targetTable.rowsArrayList); // 直接调用排序 System.out.println("排序完成!当前Table的行内容:"); for (Rows row : targetTable.rowsArrayList) { row.printRows(); } } else { System.out.println("输入的Table编号不存在!"); } } else { System.out.println("请输入有效的整数编号!"); } }
两种方式的区别
- 方法一更灵活:可以在不同场景下定义不同的排序规则(比如偶尔需要按行内容排序),无需修改
Rows类的结构。 - 方法二更简洁:如果所有场景下
Rows都只需要按行号排序,实现Comparable后可以直接复用排序逻辑。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

