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版权协议,转载请附上原文出处链接和本声明。
