HashSet的remove方法报错问题求教

问题描述

HashSet 包含某Object=true,但是remove该Object就报错。Object RecordNumber重写了toString hashCode equals 方法,估计是这里有问题。请教如何解决HashSet的remove方法报错问题!以下是代码,请帮忙测试更正remove报错问题,谢谢!import java.text.ParseException; import java.util.Date; //数据源 表名 时间 (记录数量) public class RecordNumber { public final static int CSUDF_SYS_CELL_HOUR_G = (int) 0; public final static int CSUDF_SYS_RTF_HOUR_G = (int) 1; public final static int CSUDF_SYS_GPROC_HOUR_G = (int) 2; private String OMC; private String TableName; private Date DateTime; public RecordNumber(String DataSource, String TableName, Date DateTime) { this.OMC = DataSource; this.TableName = TableName; this.DateTime = DateTime; } public String getOMC() { return this.OMC; } public String getTableName() { return this.TableName; } public Date getDateTime() { return this.DateTime; } public int getTableNameInt() { int x = 1000; if (TableName.equals("CSUDF_SYS_CELL_HOUR_G")) { x = (int) CSUDF_SYS_CELL_HOUR_G; } if (TableName.equals("CSUDF_SYS_RTF_HOUR_G")) { x = CSUDF_SYS_RTF_HOUR_G; } if (TableName.equals("CSUDF_SYS_GPROC_HOUR_G")) { x = CSUDF_SYS_GPROC_HOUR_G; } return x; } @Override public String toString() { return (this.OMC + "," + this.TableName + "," + this.DateTime); } @Override public boolean equals(Object o) { return (o instanceof RecordNumber) && toString().equals(((RecordNumber) o).toString()); } @Override public int hashCode() { int hash = 7; hash = 37 * hash + (this.OMC != null ? this.OMC.hashCode() : 0); hash = 37 * hash + (this.TableName != null ? this.TableName.hashCode() : 0); hash = 37 * hash + (this.DateTime != null ? this.DateTime.hashCode() : 0); return hash; } //单元测试 public static void main(String[] args) throws ParseException { java.text.DateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm"); RecordNumber rn = new RecordNumber("OMCSP9", "CSUDF_SYS_CELL_HOUR_G", df.parse("2010-10-26 07:00")); java.util.Set<RecordNumber> testSet = new java.util.LinkedHashSet<RecordNumber>(); testSet.add(rn); rn = new RecordNumber("OMCSP1", "CSUDF_SYS_CELL_HOUR_G", df.parse("2010-10-26 07:00")); testSet.add(rn); rn = new RecordNumber("OMCSP11", "CSUDF_SYS_CELL_HOUR_G", df.parse("2010-10-26 07:00")); testSet.add(rn); System.out.println(testSet.size()); for (RecordNumber x : testSet) { System.out.println(x); System.out.println("testSet包含该RecordNumber:" + testSet.contains(x)); testSet.remove(x); System.out.println(testSet.size()); } } } run: 3 OMCSP9,CSUDF_SYS_CELL_HOUR_G,Tue Oct 26 07:00:00 CST 2010 testSet包含该RecordNumber:true 2 Exception in thread "main" java.util.ConcurrentModificationException at java.util.LinkedHashMap$LinkedHash-terator.nextEntry(LinkedHashMap.java:373) at java.util.LinkedHashMap$KeyIterator.next(LinkedHashMap.java:384) at datatransfer.RecordNumber.main(RecordNumber.java:79) Java Result: 1 成功生成(总时间:0 秒)

解决方案

可以使用如下方式:for (Iterator<RecordNumber> it = testSet.iterator(); it.hasNext();) { RecordNumber rn = it .next(); System.out.println(rn); System.out.println("testSet包含该RecordNumber:" + testSet.contains(rn)); it.remove();}
解决方案二:
LinkedHashSet是非线程同步的,不允许在遍历的同时去删除或修改里面的元素。你可以在JDK文档里面查到
解决方案三:
HashSet是一个快速失败的,不能这样迭代的删除元素。

时间: 2024-09-09 01:51:17

HashSet的remove方法报错问题求教的相关文章

stringbuilder-Java Stringbuilder调用append()方法报错

问题描述 Java Stringbuilder调用append()方法报错 报错: The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class 知道了 顺便说一句 回答问题就好好回答 不愿回答就不用回答 即使别人问的问题在弱智或者啥的 也不用嘲笑别人吧....... 解决方案 先贴代码,在贴错误,肯定是代码语法有问题并且是简单问题,这个错是编译器提示的.看

ios-在继承类中调用方法报错

问题描述 在继承类中调用方法报错 有两个类A和B.在A类中: @interface A : B 在B类中,得到如下代码: self.navigationItem.rightBarButtonItem = [UIBarButtonItem barItemWithImage:[UIImage imageNamed:@""Add-button-normal""] highlightedImage:[UIImage imageNamed:@""Add-b

ssh整合-常见的SSH执行save方法报错,

问题描述 常见的SSH执行save方法报错, 报错:Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'driverClassName' of bean class [com.mchange.v2.c3p0.ComboPooledDataSource]: Bean property 'driverClassName' is not writable or has an inval

android中关于ProgressDialog中setProgressStyle方法报错问题

问题描述 android中关于ProgressDialog中setProgressStyle方法报错问题 我在设置进度条的时候使用setProgressStyle方法,但是报错,说是并没有这个方法,打开ProgressDialog源码也没有发现这个方法,该怎么做 解决方案 关于ResultSet.last()方法报错问题的解决Android ProgressDialog 处理方法: 解决方案二: 是不是源码没关联全?按理应该有此方法的阿

数据库反向生成的项目调用findByProerty方法报错

问题描述 利用数据库反向生成的项目,调用findByProerty(StringpropertyName,....)方法报错,搞了一个下午了,实在不知道怎么解决了,错误代码如下:Exceptioninthread"main"javax.ejb.EJBException:EJBException:;nestedexceptionis:<openjpa-1.1.1-SNAPSHOT-r422266:891341nonfatalusererror>org.apache.openj

引入第三方jar,执行封装的方法报错,大神求助

问题描述 引入第三方jar,执行封装的方法报错,大神求助 2016-05-23 14:58:54.053::WARN: Nested in org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String

on estroy-Android上onDestroy方法报错

问题描述 Android上onDestroy方法报错 @Override protected void onDestroy() { System.out.println(""onDestroy AppActivity""); Intent intent = new Intent(AppActivity.this Alarmreceiver.class); intent.setAction(""arui.alarm.action"&quo

java中为什么在main方法里面写sleep方法报错

问题描述 java中为什么在main方法里面写sleep方法报错 java中为什么在main方法里面写sleep方法报错,能看到图片吗,图片里有详细代码 解决方案 import java.lang.Thread;有没有加上 解决方案二: 开发建议采用Eclipse开发工具,这样导包和异常处理就很方便了. 解决方案三: 开发建议采用Eclipse开发工具,这样导包和异常处理就很方便了. 解决方案四: java中main()方法是哪个类里面的方法?JAVA中sleep().wait().yield(

java ee-eclipse执行main方法报错

问题描述 eclipse执行main方法报错 Eclipse版本:Eclipse Java EE IDE for Web Developers. Version: Luna Service Release 2 (4.4.2) 系统版本:OS X Yosemite 10.10.5 (14F27) 当我执行Main方法的时候就报错说大概是jdk找不到还是什么,但是我检查擦eclipse的jdk配置是正确的,如图(图片现在上传不上来,我等会试试) 我又自己写了个Java程序,用终端执行,就可以,不知道