编程中遇到的问题

1 在Java中,使用 int a = ls.get(l); int b = ls.get(r); if (a != b) { return false; }if (ls.get(l) != ls.get(r)) { return false; } 的结果可能不同,特别是在处理 Integer 对象时。这主要是由于Java的自动装箱和拆箱机制以及Integer对象的比较方式引起的。

自动装箱与拆箱

  1. 自动装箱(Autoboxing):这是指Java自动地将基本数据类型转换为对应的包装类对象。例如,int 转换为 Integer
  2. 自动拆箱(Unboxing):这是指Java自动地将包装类对象转换为对应的基本数据类型。例如,Integer 转换为 int

比较运算符 !=

  • 当你使用 != 比较两个 Integer 对象时,实际上是比较它们的引用地址,而不是它们的值。
  • 而当你将 Integer 对象拆箱为 int 后再比较时,比较的是它们的实际数值。

问题的具体解释

方法一:使用中间变量

int a = ls.get(l); int b = ls.get(r); if (a != b) { return false; }

在这种写法中,ls.get(l)ls.get(r) 会被自动拆箱为 int,然后比较它们的数值。如果它们的数值相等,即使它们的 Integer 对象引用不同,结果也是相等的。

方法二:直接比较

if (ls.get(l) != ls.get(r)) { return false; }

在这种写法中,ls.get(l)ls.get(r) 返回的是 Integer 对象。使用 != 比较的是两个 Integer 对象的引用地址,而不是数值。因此,如果 ls.get(l)ls.get(r) 是不同的 Integer 对象,即使它们的值相等,!= 也会返回 true,因为它们的引用地址不同。

2 数组和集合的排序

1)Arrays.sort是一个静态方法,用于对数组进行排序。它可以对基本数据类型数组和对象数组进行排序。

自定义排序算法:

public static ArrayList<Integer> findAllPerson(int n, int[][] meetings, int firstPerson) {
        // 按照接触时间从小到大排序
        Arrays.sort(meetings, (o1, o2) -> Integer.compare(o1[2], o2[2]));

        HashSet<Integer> set = new HashSet<>();
        set.add(0);  // 最初的人
        set.add(firstPerson);

        for (int i = 0; i < meetings.length; i++) {
            int person1 = meetings[i][0];
            int person2 = meetings[i][1];

            if (set.contains(person1) || set.contains(person2)) {
                set.add(person1);
                set.add(person2);
            }
        }

        ArrayList<Integer> res = new ArrayList<>(set);
        Collections.sort(res);
        return res;
    }

2)Collections.sort是一个静态方法,用于对集合进行排序。它通常用于排序实现了List接口的集合。

自定义排序:

 Collections.sort(intervals,new Comparator<Interval>(){
            public int compare(Interval o1,Interval o2){
                if(o1.start==o2.start)
                    return Integer.compare(o1.end,o2.end);
                return Integer.compare(o1.start,o2.start);
            }
        });

//或者
public class IntervalComparator implements Comparator<Interval> {
    @Override
    public int compare(Interval o1, Interval o2) {
        if (o1.start == o2.start) {
            return Integer.compare(o1.end, o2.end);
        }
        return Integer.compare(o1.start, o2.start);
    }
}
Collections.sort(intervals, new IntervalComparator());

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值