【问题标题】:Why does the equals method returns false although the two lists contain the same elements [closed]尽管两个列表包含相同的元素,但为什么 equals 方法返回 false [关闭]
【发布时间】:2016-05-24 13:06:29
【问题描述】:
    public class dosing {



    public List<String> dosingColumnList(String roa){

        List<String> dosingList = new ArrayList<String>();
        dosingList.add("Dose");
        dosingList.add("Time of Dose");
        dosingList.add("Tau");

        if(roa.equalsIgnoreCase("abc") ||
                roa.equalsIgnoreCase("bcd")){
        }
        else if(roa.equalsIgnoreCase("cba")){
            dosingList.add("Length of Infusion");
        }
        else if(roa.equalsIgnoreCase("cbd")){
            dosingList.add("Length of Infusion");
        }

        return dosingList;

    }

    public boolean readFile(File filePath,int sheetNo,String roa) throws InvalidFormatException, IOException{

        FileInputStream inputStream = new FileInputStream(filePath);

        Workbook wb = WorkbookFactory.create(inputStream);


        Sheet mySheet = wb.getSheetAt(sheetNo);

        List<String> dosingColumnData =dosingColumnList(roa);

        Iterator<Row> rowIter = mySheet.rowIterator();
        List<String> headerData = new ArrayList<String>();
        //rowIter.next();
        while (rowIter.hasNext()){
            Row row = rowIter.next();
            Iterator<Cell> cellIterator = row.cellIterator();
            while(row.getRowNum() == 0){
                while (cellIterator.hasNext()){

                    Cell cell = cellIterator.next();
                    if(cell.getCellType() == Cell.CELL_TYPE_STRING){
                        String varData = cell.getStringCellValue();
                        headerData.add(varData);

                    }

                }
                break;
            }

         }

        if (headerData == null || dosingColumnData == null){

        }

        if((headerData == null && dosingColumnData != null) 
          ||( headerData != null && dosingColumnData == null)
          || (headerData.size() != dosingColumnData.size())){

        }


        headerData = new ArrayList<String>(headerData); 
        dosingColumnData = new ArrayList<String>(dosingColumnData);   

        Set<String> set1 = new HashSet<String>();
        set1.addAll(headerData);
        Set<String> set2 = new HashSet<String>();
        set2.addAll(dosingColumnData);

        System.out.println(set1 + "   " + set2);

        return set1.equals(set2);
    }

}

这是我正在使用的代码...所有导入...所以 headerdata 列表包含来自 excel 表的行数据,而 dosingColumnData 包含来自用户选择的列表 ....SOP 的输出是 [Length, Time, Tau, Dose] [Length, Time, Tau, Dose]...虽然上面的两个集合有相同的类型,相同的大小,相同的元素顺序...return语句总是输出false

【问题讨论】:

  • 在调用 equals 方法时,您不需要将 set2 强制转换为对象
  • 我的集合中的@Eran 元素是字符串
  • 你能发一个minimal reproducible example吗?我无法重现。
  • @InFed 这是第三次有人要求您提供填充这些集合的代码。如果您不向我们提供足够的信息,您怎么能期望得到帮助...?

标签: java


【解决方案1】:

我已对您的代码进行了如下测试:

List<String> headerData = Arrays.asList(new String[] {"Lenght", "Time", "Tau", "Dose"});
List<String> dosingColumnData = Arrays.asList(new String[] {"Lenght", "Time", "Tau", "Dose"});

Set<String> set1 = new HashSet<String>();
set1.addAll(headerData);
Set<String> set2 = new HashSet<String>();
set2.addAll(dosingColumnData);

System.out.println(set1.equals(set2)); // prints true

最后打印的是 true,所以问题应该与 headerData 和 dosingColumnData 集合中包含的数据有关。

【讨论】:

    【解决方案2】:

    打印集合的相同输出是无关紧要的。

    这是接口Setequals()方法的definition

    比较指定对象与此集合是否相等。如果指定对象也是一个集合,则返回 true,这两个集合具有相同的大小,并且指定集合的​​每个成员都包含在此集合中(或等效地,此集合的每个成员都包含在指定集合中)。此定义确保 equals 方法在 set 接口的不同实现中正常工作。

    所以你可以自己试一试,单步执行代码:

    boolean equal = set1.size() == set2.size();
    if(equal) {
      for(Object x: set1) {
        if(!set2.contains(x)) {
          equal = false;
          break;
        }
      }
    } 
    System.out.println(equal);
    

    为了正常运行,元素类必须实现方法equals()hashCode()Object 类的默认实现在大多数情况下不可用,因为它们依赖于对象实例。

    【讨论】:

    • 感谢您的回答..我按照您的建议进行了调试..一组中的某些字符串未被其他..我现在必须知道为什么..谢谢
    猜你喜欢
    • 2020-11-29
    • 2019-01-17
    • 1970-01-01
    • 2018-05-11
    • 2014-01-18
    • 2017-11-08
    • 1970-01-01
    • 2014-10-14
    相关资源
    最近更新 更多