java问题,数组去掉重复的元素

有个Student类型的数组。Student[] sArray = Student[100];
Student的属性有学号num,姓名name。比如这个sArray里面含有相同的学生(即学号和姓名都相同)。
如何去掉数组相同的元素
HashSet<Student> set = new HashSet<Student>();
for(Student obj: s){
set.add(obj);
}
Student[] s2 = set.toArray(new Student[set.size()]);
for(int j=0;j<s2.length;j++)
{
System.out.print(s2[j].name+s2[j].id);

}

//我是这么写的,为什么最后还是输出了三个元素(原来的数组s长度为三,有两个重复的元素)

补充楼下放在Set 中的思路。

HashSet 判断两个对象相等的标准除了要求通过 equals() 方法比较返回 true 之外,还要求两个对象的 hashCode() 返回值相等。所以如果只是学号和姓名相同,并不能过滤掉,你需要重写Student的equals和hashCode方法。

如果不想写,有另一种思路, 遍历数组,把学号和姓名拼起来,作为一个key,Strudent作为value,然后存到Map中,最终获取Map的values即可。追问

比如现在我得到了这个set,我应该怎么把它变成一个student数组呢,对这个不熟悉啊

追答 HashSet<Student> set = new HashSet<Student>();
Student[] s = new  Student()[set.size()];
set.toArray(s);

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-19
你这里好像有问题学号与姓名相同,那学号不唯一的嘛,
Set集合应该不行因为你的两个比较参数 学号和姓名Set 只能单独放一个,

你可以考虑用Map,用num作key ,name作value,如果key一样value会被覆盖掉,
你可以双重for循环去遍历比较如果外层for与里层的for一样且位置不一样你就删掉追问

能不能把第二种方法具体的写出来呢

追答

我用Map写地:
public class Students
{
private String num;
private String name;
public static void main(String[] args)
{
List stuList=new ArrayList();
Map stuMap=new HashMap();
Students st1=new Students();
st1.setNum("001");
st1.setName("jay");
Students st2=new Students();
st2.setNum("001");
st2.setName("jay");
Students st3=new Students();
st3.setNum("002");
st3.setName("jay");
stuList.add(st1);
stuList.add(st2);
stuList.add(st3);
for(Students stu:stuList)
{
//将学号与姓名接连做为key值,Students做为值
stuMap.put(stu.getNum()+stu.getName(),stu);
}
Set set=stuMap.keySet();//获取Map里的所有key值集合
for(String key:set)//遍历key
{
//根据key值从stuMap取出相应的Students信息
Students students=stuMap.get(key);
System.out.println(students);
}
}

//getter and setter
些处省略......

//重写toString方法
public String toString()
{
return "num:"+num+" name:"+name;
}
}

第2个回答  推荐于2016-04-02
利用map

public class DistinctObject {

public static Map<Integer, String> map = new HashMap<Integer, String>();
public static void main(String[] args){

// 产生数组
StudentModel[] students = createStudents();

// 去掉重复元素
distinctStudents(students);

for (Map.Entry<Integer, String> m : map.entrySet()) {
System.out.println(m.getKey() + " " + m.getValue());
}
}

public static Map<Integer, String> distinctStudents(StudentModel[] students){

for (StudentModel sm : students) {
// 学号相同 则为重复
map.put(sm.getStudentId(), sm.getStudentName());
}

return map;
}

public static StudentModel[] createStudents(){

StudentModel[] students = new StudentModel[10];
int k = 0;
for (int i = 0; i < 10; i++) {
k = i;
StudentModel sm = new StudentModel();
if (k > 5) k = k - 4;
sm.setStudentId(k + 1);
sm.setStudentName("student_" + (k + 1));
students[i] = sm;
}

return students;
}

//Student
static class StudentModel{

private int studentId;
private String studentName;

public int getStudentId() {
return studentId;
}

public void setStudentId(int studentId) {
this.studentId = studentId;
}

public String getStudentName() {
return studentName;
}

public void setStudentName(String studentName) {
this.studentName = studentName;
}
}追问

不需要看学号,只需要比较名字的话怎么办,只要名字相同的就去掉,并且最后要得到一个数组。(因为学生的属性还有别的,把学生当做一个object)

追答public class DistinctObject {

    
    public static Map<String, StudentModel> map = new HashMap<String, StudentModel>();
    public static void main(String[] args){
        
        // 产生数组
        StudentModel[] students = createStudents();

        //更改---------------------------------------------------------
        // 去掉重复元素
        StudentModel[] result = distinctStudents(students);

        for(StudentModel sm : result){
            System.out.println(sm.getStudentId()+"  "+sm.getStudentName());
        }
    }
    
    //更改----------------------------------------------------------------
    public static StudentModel[] distinctStudents(StudentModel[] students){
        
        //key->学生姓名
        //value->学生对象
        for (StudentModel sm : students) {
            // 学号相同 则为重复
            //如果有什么特许的需求,可以在这里比较 (去掉空格,字母大小之类的)
            map.put(sm.getStudentName(), sm);
        }
        
        StudentModel[] result = map.values().toArray(new StudentModel[0]);
        return result;
    }

本回答被提问者采纳
第3个回答  2015-11-04
第一种:通过循环遍历比对去除
使用循环去一一比对,如果有重复的将其中一个制空;

第二种:使用set集合去除
利用set集合不能保存想听元素的特性,将数据的元素存至set集合中,然后将set集合中的值转存至数据即可;
第4个回答  2013-11-19
给你一个思路就行了,Set是不可以放入重复的元素的,遍历数组,存入Set中就可以了很简单的追问

报了个错,Student cannot be cast to java.lang.Comparable?

相似回答