java中去重方法for循环,Set,TreeMap统计数量

java中去重的三种方法(for循环,Set,TreeMap)

看文章看看荤段子先,一女和两个男的在网吧玩吃鸡,一局游戏完毕,女的问其中一个男生,你觉得吃鸡中哪把枪最好,男回答:“当然是AWM了”,问另一个男生,你觉着哪把枪最好,男回答:“M249”,最后女生跟第二个男生走了。你懂了吗???

不知道你们玩不玩LOL啊,我就以英雄联盟中英雄作示例实体类??,详情看下面代码:

public class HeroAlliance {
 //英雄名
 private String heroName;
 //Q技能
 private String skillQ;
 //W技能
 private String skillW;
 //E技能
 private String skillE;
 //R技能
 private String skillR;
 //英雄出生日期
 private Date birthDate;
 //英雄皮肤个数
 private int heroSkinNum;
 //英雄口头禅
 private String heroTag;
 //相同对象数量
 private int count;
 public HeroAlliance(String heroName, String skillQ, String skillW, String skillE, String skillR, Date birthDate,
   int heroSkinNum, String heroTag, int count) {
  super();
  this.heroName = heroName;
  this.skillQ = skillQ;
  this.skillW = skillW;
  this.skillE = skillE;
  this.skillR = skillR;
  this.birthDate = birthDate;
  this.heroSkinNum = heroSkinNum;
  this.heroTag = heroTag;
  this.count = count;
 }
 public String getHeroName() {
  return heroName;
 }
 public int getCount() {
  return count;
 }
 public void setCount(int count) {
  this.count = count;
 }
 public String getHeroTag() {
  return heroTag;
 }
 public void setHeroTag(String heroTag) {
  this.heroTag = heroTag;
 }
 public void setHeroName(String heroName) {
  this.heroName = heroName;
 }
 public Date getBirthDate() {
  return birthDate;
 }
 public void setBirthDate(Date birthDate) {
  this.birthDate = birthDate;
 }
 public int getHeroSkinNum() {
  return heroSkinNum;
 }
 public void setHeroSkinNum(int heroSkinNum) {
  this.heroSkinNum = heroSkinNum;
 }
 public String getSkillQ() {
  return skillQ;
 }
 public void setSkillQ(String skillQ) {
  this.skillQ = skillQ;
 }
 public String getSkillW() {
  return skillW;
 }
 public void setSkillW(String skillW) {
  this.skillW = skillW;
 }
 public String getSkillE() {
  return skillE;
 }
 public void setSkillE(String skillE) {
  this.skillE = skillE;
 }
 public String getSkillR() {
  return skillR;
 }
 public void setSkillR(String skillR) {
  this.skillR = skillR;
 }
 
 @Override    
 public boolean equals(Object obj) {        
  if (obj == null)            
   return false;        
  if (this == obj)            
   return true;        
  if (obj instanceof HeroAlliance) {            
   HeroAlliance vo = (HeroAlliance) obj;             
   // 比较每个属性的值 一致时才返回true            
   if (vo.heroName.equals(this.heroName) && vo.heroTag.equals(this.heroTag))                
    return true;        
   }
  return false;    
  }     
 /** 重写hashcode 方法,返回的hashCode不一样才再去比较每个属性的值     */    
 @Override    
 public int hashCode() {        
  return heroName.hashCode() * heroTag.hashCode();    
  }
}

下面是去重的三种方法,我放在了一个测试类中(执行第三种方法时要将第一种方法注释掉,不然统计的数量不对哦!),common上代码:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import org.springframework.util.CollectionUtils;
public class Test {
 public static void main(String[] args) throws ParseException {
  SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  //以当前系统日期代替英雄出生日期
  Date date=sdf.parse(sdf.format(new Date()));
  List<HeroAlliance> heroList=new ArrayList<HeroAlliance>();
  Set<HeroAlliance> heroSet=new HashSet<HeroAlliance>();
  HeroAlliance heA1=new HeroAlliance("亚索","斩钢闪","风之障壁","踏前斩","狂风绝息斩",date,7,"死亡如风,常伴吾身",0);
  heroList.add(heA1);
  heroSet.add(heA1);
  HeroAlliance heA2=new HeroAlliance("盲僧", "天音波/回音击", "金钟罩/铁布衫", "天雷破/摧筋断骨", "",date, 11,"我用双手成就你的梦想",0);
  heroList.add(heA2);
  heroSet.add(heA2);
  HeroAlliance heA3=new HeroAlliance("迦娜", "飓风呼啸", "和风守护", "风暴之眼", "复苏季风",date, 10,"是的,只要998,我就能让你爽的不能呼吸哟",0);
  heroList.add(heA3);
  heroSet.add(heA3);
  HeroAlliance heA4=new HeroAlliance("厄运小姐", "一箭双雕", "大步流星", "枪林弹雨", "弹幕时间",date, 14,"我有两把枪,一把叫射,一把叫啊",0);
  heroList.add(heA4);
  heroSet.add(heA4);
  HeroAlliance heA5=new HeroAlliance("内瑟斯", "汲魂痛击", "枯萎", "灵魂烈焰", "死神降临",date, 8,"生与死,轮回不止",0);
  heroList.add(heA5);
  heroSet.add(heA5);
  HeroAlliance heA6=new HeroAlliance("伊泽瑞尔", "秘术射击", "精华跃动", "奥术跃迁", "精准弹幕",date, 13,"在别的游戏里,像我这么帅的一般都是主角哟",0);
  heroList.add(heA6);
  heroSet.add(heA6);
  HeroAlliance heA7=new HeroAlliance("亚索","斩钢闪","风之障壁","踏前斩","狂风绝息斩",date,7,"死亡如风,常伴吾身",0);
  heroList.add(heA7);
  heroSet.add(heA7);
  HeroAlliance heA8=new HeroAlliance("厄运小姐", "一箭双雕", "大步流星", "枪林弹雨", "弹幕时间",date, 14,"我有两把枪,一把叫射,一把叫啊",0);
  heroList.add(heA8);
  heroSet.add(heA8);
  //1.以for循环为List去重
  if (!CollectionUtils.isEmpty(heroList)) {
   for (int i = 0; i < heroList.size() - 1; i++) {
    for (int j = heroList.size() - 1; j > i; j--) {
     //以名字和口头禅相同为对象去重
     if (heroList.get(j).getHeroName().equals(heroList.get(i).getHeroName())
       && heroList.get(j).getHeroTag().equals(heroList.get(i).getHeroTag()) ) {
      heroList.remove(j);
     }
    }
   }
  }
  for(int i=0;i<heroList.size();i++){
   HeroAlliance heA=heroList.get(i);
   System.out.println(heA.getHeroName()+":"+heA.getHeroTag()+"!"+"   "+
   "Q:"+heA.getSkillQ()+","+"W:"+heA.getSkillW()+","+"E:"+heA.getSkillE()+","+"R:"+heA.getSkillR()+"。");
  }
  System.out.println("---------------------------------------------------------------------------------------------");
  //2.因为Set本身存放的就是无序,唯一的值,所以会自动去重(针对八大基本数据类型和String类型),将其循环遍历即可,对于对象我在实体类中重新覆盖了hashCode方法
  for(HeroAlliance heA:heroSet){
   System.out.println(heA.getHeroName()+":"+heA.getHeroTag()+"!"+"   "+
   "Q:"+heA.getSkillQ()+","+"W:"+heA.getSkillW()+","+"E:"+heA.getSkillE()+","+"R:"+heA.getSkillR()+"。");
  }
  System.out.println("---------------------------------------------------------------------------------------------");
  //3.TreeMap统计相同对象数量(以英雄名和口头禅做基准认定为同一对象),做第三种方法前将第一种方法注释,不然你统计的数量肯定不对,切记!
  Map<Object, Integer> map = new TreeMap<Object, Integer>();
  for (HeroAlliance heA : heroList) {
   String heNT = heA.getHeroName() + heA.getHeroTag();
   if (map.get(heNT) == null) {
    map.put(heNT, 1);
   } else {
    map.put(heNT, map.get(heNT) + 1);
   }
  }
  for(int i=0;i<heroList.size();i++){
   HeroAlliance heAs=heroList.get(i);
   String heNTs = heAs.getHeroName() + heAs.getHeroTag();
   for (Entry<Object, Integer> m : map.entrySet()) {
          if(heNTs.equals(m.getKey())){
           heAs.setCount(m.getValue());
          }
      }
  }
  Set<HeroAlliance> setList=new HashSet<HeroAlliance>();
  for(int i=0;i<heroList.size();i++){
   HeroAlliance heAS=heroList.get(i);
   setList.add(heAS);
  }
  for(HeroAlliance heA:setList){
   System.out.println(heA.getHeroName()+":"+heA.getHeroTag()+"!"+"   "+
   "Q:"+heA.getSkillQ()+","+"W:"+heA.getSkillW()+","+"E:"+heA.getSkillE()+","+"R:"+heA.getSkillR()+"。"+"       count:"+heA.getCount());
  }
 }
}

今日份鸡汤:富人的生活千姿百态,穷人的生活大致相同。
在这里插入图片描述
进都进了,点个赞再走吧!


版权声明:本文为weixin_43599906原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。