You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

检查对象集合是否包含指定字符串及Java代码逻辑分析

你的Java代码逻辑问题分析与修正

先直接点明核心问题:你的代码目前无法正确判断集合中是否已存在对应字符串的Types实例,主要有两个关键漏洞:

1. List.contains()的参数类型完全不匹配

在getShiftTypes()方法里,你调用了types.contains(shift)——但types是List<Types>类型,而shift是String类型。contains()方法会依赖Types类的equals()做比较,但你的equals()方法只判断传入对象是否是Types实例:当传入的是String时,object instanceof Types直接返回false,导致contains()永远返回false。这意味着不管shifts_arr_t里有没有重复字符串,循环都会每次创建新的Types对象加入集合,完全起不到去重作用。

2. 未完成且错误的equals()方法

你的Types.equals()方法不仅没写完,现有逻辑还有致命问题:

  • 用this.type == ((Types)object).type比较字符串是错误的——==比较的是字符串对象的引用地址,而非实际内容。如果两个字符串内容相同但不是同一个对象(比如通过new String()创建),==会返回false,正确做法是用this.type.equals(((Types)object).type)。
  • 没有处理this.type为null的情况,会触发空指针异常。
  • 按照Java规范,重写equals()必须同时重写hashCode(),否则会导致HashSet等集合的行为异常。

修正后的代码示例

第一步:完善Types类

import java.util.Objects;

public class Types {
    String type;
    int count;

    public Types(String type) {
        this.type = type;
    }

    @Override
    public boolean equals(Object object) {
        // 先判断是否为同一对象引用
        if (this == object) return true;
        // 判断是否为null或类型不匹配
        if (object == null || getClass() != object.getClass()) return false;
        // 强转为Types类型
        Types types = (Types) object;
        // 安全比较字符串内容(自动处理null)
        return Objects.equals(this.type, types.type);
    }

    @Override
    public int hashCode() {
        // 生成与equals逻辑匹配的hashCode
        return Objects.hash(type);
    }

    // 可选:增加getter方法,方便后续操作
    public String getType() {
        return type;
    }
}

第二步:修正getShiftTypes()方法

现在我们需要正确判断集合中是否存在type等于shift的Types实例,有两种简洁写法:

写法1:循环遍历判断(兼容所有Java版本)

private static List<Types> getShiftTypes() {
    List<Types> types = new ArrayList<>();
    for (String shift : shifts_arr_t) {
        boolean exists = false;
        for (Types t : types) {
            if (Objects.equals(t.getType(), shift)) {
                exists = true;
                break;
            }
        }
        if (!exists) {
            types.add(new Types(shift));
        }
    }
    return types;
}

写法2:用Stream简化(Java 8+)

private static List<Types> getShiftTypes() {
    List<Types> types = new ArrayList<>();
    for (String shift : shifts_arr_t) {
        boolean exists = types.stream()
                .anyMatch(t -> Objects.equals(t.getType(), shift));
        if (!exists) {
            types.add(new Types(shift));
        }
    }
    return types;
}

如果你的需求只是去重,还可以用更简洁的流式写法:

import java.util.stream.Collectors;
import java.util.Arrays;

private static List<Types> getShiftTypes() {
    return Arrays.stream(shifts_arr_t)
            .distinct() // 先对字符串去重
            .map(Types::new) // 转成Types对象
            .collect(Collectors.toList());
}

内容的提问来源于stack exchange,提问作者Dim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:12:58