Java 自 定 义 对 象 实 现 去 重

1.概述

set集合的特点是:set无序,不可以有重复元素
hashset:数据结构为哈希表,线程是非同步的。保证元素唯一性的原理是:判断元素的hashcode值是否相同,如果相同,还会继续判断元素的euals方法,是否为ture;为ture,则是同一个对象,否则不是。
treeset:可以对set集合元素进行排序,数据结构为二叉树。保证元素唯一性的原理是:compareTo方法返回0;

简单说:hashset去重(hashcode,equals),散列。treeset方法:去重(实现comparale或comparator接口重写自定义方法中,compareto方法返回0的条件是判断去重的依据),排序(实现comparale或comparator接口重写自定义方法中,compareto方法返回的+1,-1,0,进行排序

2.使用treeset实现去重:1.自定义一个对象,2.定义一个容器,让其具有比较性(实现comparator接口,重写compare方法),将此对象作为参数传入 treeset中,

   public class Teacher {
private String name;
private int age;


/**  
* Creates a new instance of Teacher.  
*  
* @param name
* @param age  
*/  

public Teacher(String name, int age) {
super();
this.name = name;
this.age = age;
}


/**  
* name.  
*  
* @return  the name  
* @since   JDK 1.6  
*/
public String getName() {
return name;
}


/**  
* name.  
*  
* @param   name    the name to set  
* @since   JDK 1.6  
*/
public void setName(String name) {
this.name = name;
}


/**  
* age.  
*  
* @return  the age  
* @since   JDK 1.6  
*/
public int getAge() {
return age;
}


/**  
* age.  
*  
* @param   age    the age to set  
* @since   JDK 1.6  
*/
public void setAge(int age) {
this.age = age;
}


}



}
  public class MyCompare implements Comparator<Object> {
@Override
public int compare(Object o1, Object o2) {
 
// TODO Auto-generated method stub  
Teacher s1=(Teacher)o1;
Teacher s2=(Teacher)o2;
int n=s1.getName().compareTo(s2.getName());
if(n==0){//姓名相同,比较统计数
n=new Integer(s1.getAge()).compareTo(s2.getAge());
}
return n;
}
}

  测试类:

System.out.println("==================");
Set<Teacher> t=new TreeSet<Teacher>(new MyCompare());
t.add(new Teacher("liu",89));
t.add(new Teacher("jian",123));
t.add(new Teacher("jian",123));

t.add(new Teacher("juf",123));

t.add(new Teacher("four",4));
t.add(new Teacher("ni",56));
t.add(new Teacher("ni",56));
t.add(new Teacher("hao",23));
System.out.println("排序后遍历:");
for(Teacher s:t){
System.out.println(s.getName()+"=="+s.getAge());
}

结果为:

排序后遍历:

1.four==4
2.hao==23
3.jian==123 
4.juf==123  //
5.liu==89
6.ni==56
结论:结果的3,4说明:只有name,age同时相同才判断为同一对象。符合我们在自定义 的compare方法中定义的:姓名相同比较age,如果age比较后返回0,既是同一个对象,去重。

2.使用hashset实现去重:我们知道treeset,hashset存储的类型为string,interger等常用类型均能实现自动的去重。但如果要实现自定义对象实现去重效果,则需要自定义对象实现equals和hashcode方法。

2.1 以对象的所有属性相同作为重复的依据

public  class EntityTerm2  {
private String name;//名称
private String termNature;//词性
private String age;


public String getName() {
return name;
}


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


public String getTermNature() {
return termNature;
}


public void setTermNature(String termNature) {
this.termNature = termNature;
}


public String getAge() {
return age;
}


public void setAge(String age) {
this.age = age;
}


@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result
+ ((termNature == null) ? 0 : termNature.hashCode());
return result;
}


@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EntityTerm2 other = (EntityTerm2) obj;


if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;

if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;

if (termNature == null) {
if (other.termNature != null)
return false;
} else if (!termNature.equals(other.termNature))
return false;

return true;
}
 


public EntityTerm2(String name, String termNature, String age) {
super();
this.name = name;
this.termNature = termNature;
this.age = age;
}

}
  public class Test {
public static void main(String[] args){  

    Set<EntityTerm2> et2=new HashSet<EntityTerm2>();//
         et2.add(new EntityTerm2("zhangsan","nr","123"));
      et2.add(new EntityTerm2("zhangsan","nrd","1234"));
      et2.add(new EntityTerm2("lisi","ntc","45"));
      et2.add(new EntityTerm2("wanwu","nr","4"));
      for(EntityTerm2 e:et2){
     System.out.println(e.getName()+"!!!"+e.getAge());
      }
   }
}

结果为:

lisi!!!45
wanwu!!!4
zhangsan!!!1234
zhangsan!!!123

修改元素有相同值时:

  public class Test {
public static void main(String[] args){  


   Set<EntityTerm2> et2=new HashSet<EntityTerm2>();//使用treeset存放对象,对象必须实现comparable接口,hashset则不用
      et2.add(new EntityTerm2("zhangsan","nr","123"));
      et2.add(new EntityTerm2("zhangsan","nr","123"));
      et2.add(new EntityTerm2("lisi","ntc","45"));
      et2.add(new EntityTerm2("wanwu","nr","4"));
      for(EntityTerm2 e:et2){
     System.out.println(e.getName()+"!!!"+e.getAge());
      }
   }
}

结果为:

lisi!!!45
wanwu!!!4
zhangsan!!!123

1.2  以对象的name的值相同作为重复的依据

public  class EntityTerm2 implements Comparable<EntityTerm2> {
private String name;//名称
private String termNature;//词性
private String age;


public String getName() {
return name;
}


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


public String getTermNature() {
return termNature;
}


public void setTermNature(String termNature) {
this.termNature = termNature;
}


public String getAge() {
return age;
}


public void setAge(String age) {
this.age = age;
}


@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}


public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EntityTerm2 other = (EntityTerm2) obj;


if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;

return true;
}
 


public EntityTerm2(String name, String termNature, String age) {
super();
this.name = name;
this.termNature = termNature;
this.age = age;
}


}


public class Test {
public static void main(String[] args){  


    Set<EntityTerm2> et2=new HashSet<EntityTerm2>();//使用treeset存放对象,对象必须实现comparable接口
      et2.add(new EntityTerm2("zhangsan","nrd","123"));//hashset则不用,实现了去重
      et2.add(new EntityTerm2("zhangsan","nr2","123d"));
      et2.add(new EntityTerm2("lisi","ntc","45"));
      et2.add(new EntityTerm2("wanwu","nr","4"));
      for(EntityTerm2 e:et2){
     System.out.println(e.getName()+"!!!"+e.getAge());
      }
   }
}
结果为:
zhangsan!!!123
lisi!!!45
wanwu!!!4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 Java MQTT 客户端时,自动连可以通过以下步骤: 1. 在 MQTT 客户端初始化时,设置一个连的时间间隔和最大连次数。 2. 在连接断开时,使用一个计时器来计算连的时间。如果到了连时间,则进行尝试连接。 3. 如果连接成功,则置计时器和连次数。 4. 如果连接失败,则继续计算连时间并增加连次数。如果达到最大连次数,则停止尝试连。 以下是一个简单的 Java 代码示例, MQTT 客户端的自动连功能: ```java import org.eclipse.paho.client.mqttv3.*; public class MqttClientExample { private MqttClient client; private String brokerUrl = "tcp://localhost:1883"; private String clientId = "mqtt-client"; private int reconnectInterval = 5000; // 连时间间隔,单位为毫秒 private int maxReconnectAttempts = 10; // 最大连次数 public void connect() throws MqttException { MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); client = new MqttClient(brokerUrl, clientId); client.setCallback(new MqttCallback() { @Override public void connectionLost(Throwable cause) { int attempt = 0; while (attempt < maxReconnectAttempts) { try { Thread.sleep(reconnectInterval); client.connect(connOpts); break; } catch (Exception e) { attempt++; } } } @Override public void messageArrived(String topic, MqttMessage message) throws Exception { // 处理消息 } @Override public void deliveryComplete(IMqttDeliveryToken token) { // 消息发送完成回调 } }); client.connect(connOpts); } } ``` 在上面的代码中,我们使用了一个 while 循环来进行连的尝试,并且在每次连失败后增加了尝试次数。当达到最大连次数时,就停止连尝试。如果连接成功,则连次数和计时器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值