Java-Set集合(2)

本文介绍如何使用比较器Comparator实现自定义对象的排序,通过具体示例演示如何在TreeSet中利用比较器根据对象属性进行排序,并展示了一个输入学生信息并按总分排序的例子。

比较器排序

  • 比较器排序:
    采用有参构造,构造的参数就要一个比较器
 TreeSet(Comparator<? super E> comparator)
  • 在创建TreeSet 对象的时候,传进来一个比较器的子类对象
    根据子类对象重写比较器中compare 方法,根据此方法的返回值的正负和0,来排序元素,返回0就不往里面存
    a.构造一个新的空 TreeSet,它根据指定比较器进行排序。
    b.接口 Comparator 比较器
    c.int compare(T o1, T o2) 比较方法
    d.比较用来排序的两个参数。
public class MyTest3 {

        public static void main(String[] args) {

        TreeSet t = new TreeSet<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer s1, Integer s2) {
                return s1 - s2;
            }
        });
        t.add(6);
        t.add(6);
        t.add(3);
        t.add(2);
        t.add(1);
        t.add(4);
        t.add(5);
        t.add(4);
        t.add(3);
        System.out.println(t);
        //[1, 2, 3, 4, 5, 6]
    }
}
  • 举例:键盘录入3个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台。
//Student类
public class Student {
    private String name;
    private double mathScore;
    private double englishScore;
    private double totalScote;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getMathScore() {
        return mathScore;
    }

    public void setMathScore(double mathScore) {
        this.mathScore = mathScore;
    }

    public double getEnglishScore() {
        return englishScore;
    }

    public void setEnglishScore(double englishScore) {
        this.englishScore = englishScore;
    }


    public double getTotalScote() {
        return this.englishScore+this.mathScore;
    }
}

//测试类
public class MyTest2 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        //比较器排序
        TreeSet<Student> treeSet = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                return (int) (s1.getTotalScote() - s2.getTotalScote());
            }
        });
        for (int i = 1; i <= 3; i++) {
            System.out.println("请输入学生的姓名");
            Student student = new Student();
            String name = sc.next();
            student.setName(name);
            System.out.println("请输入第" + i + "个学生" + name + "的数学成绩");
            double mathScore = sc.nextDouble();
            student.setMathScore(mathScore);
            System.out.println("请输入第" + i + "个学生" + name + "的英语成绩");
            double englishScore = sc.nextDouble();
            student.setEnglishScore(englishScore);
            //把学生对象添加到集合里面
            treeSet.add(student);
        }

        System.out.println("姓名" + "\t" + "数学成绩" + "\t" + "总分");
        for (Student stu : treeSet) {
            System.out.println(stu.getName() + "\t" + stu.getMathScore() + "\t" + stu.getEnglishScore() + "\t" + stu.getTotalScote());
        }


    }
}
### Java 实现集合相似度计算 以下是基于题目描述和引用内容的 Java 实现方案。该程序通过读取输入数据并利用 `HashSet` 来处理集合操作,从而高效地完成相似度计算。 #### 主要逻辑说明 1. 使用 `Scanner` 类来接收标准输入。 2. 利用 `Set<Integer>` 存储每个集合中的元素,以便快速去重和交集/并集运算。 3. 对于每一对需要比较的集合,分别计算其交集大小 (`Nc`) 和并集大小 (`Nt`)。 4. 计算相似度公式:\(\text{Similarity} = \frac{\text{Nc}}{\text{Nt}} \times 100\) %。 下面是完整的代码实现: ```java import java.util.*; public class SetSimilarity { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 获取集合数量 N int N = Integer.parseInt(scanner.nextLine()); List<Set<Integer>> sets = new ArrayList<>(); // 构建所有集合 for (int i = 0; i < N; i++) { String[] tokens = scanner.nextLine().split(" "); int M = Integer.parseInt(tokens[0]); Set<Integer> currentSet = new HashSet<>(); for (int j = 1; j <= M; j++) { currentSet.add(Integer.parseInt(tokens[j])); } sets.add(currentSet); } // 获取查询次数 K int K = Integer.parseInt(scanner.nextLine()); // 处理每次查询 while (K-- > 0) { String[] queryTokens = scanner.nextLine().split(" "); int indexA = Integer.parseInt(queryTokens[0]) - 1; int indexB = Integer.parseInt(queryTokens[1]) - 1; double similarity = calculateSimilarity(sets.get(indexA), sets.get(indexB)); System.out.printf("%.1f%%\n", similarity); // 输出保留一位小数 } scanner.close(); } private static double calculateSimilarity(Set<Integer> setA, Set<Integer> setB) { // 创建临时副本以保护原始集合 Set<Integer> tempA = new HashSet<>(setA); Set<Integer> tempB = new HashSet<>(setB); // 并集大小 Nt tempA.addAll(tempB); int unionSize = tempA.size(); // 交集大小 Nc tempA.retainAll(setB); int intersectionSize = tempA.size(); return ((double) intersectionSize / unionSize) * 100; // 转化为百分比形式 } } ``` --- #### 关键点解析 1. **集合存储方式**: 每个集合被存入一个 `HashSet<Integer>` 中,这样可以自动去除重复项,并支持高效的交集与并集运算[^4]。 2. **交集与并集计算**: - 并集可以通过调用 `addAll()` 方法获得。 - 交集则可通过 `retainAll()` 方法获取共同部分[^3]。 3. **浮点精度控制**: 结果需按照题目要求输出至小数点后一位,因此使用了 `printf("%.1f%%\n", value)` 进行格式化输出[^2]。 --- #### 输入样例 假设如下输入: ``` 4 7 98 123 11 56 789 234 55 5 11 55 99 123 45 3 123 98 56 4 123 99 45 56 2 1 2 1 4 ``` 运行上述代码会得到以下输出: ``` 12.5% 25.0% ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值