集合练习

七、练习

按要求实现:

(1)封装一个新闻类,包含标题和内容属性,提供get、set方法,重写toString方法,打印对象时只打印标题;

(2)只提供一个带参数的构造器,实例化对象时,只初始化标题;并且实例化两个对象:

新闻一:新冠确诊病例超干万,数百万印度教信徒赴恒河“圣浴”引民众担忧

新闻二:男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生

(3)将新闻对象添加到ArrayList集合中,并且进行倒序遍历:(4)

(4)在遍历集合过程中,对新闻标题进行处理,超过15字的只保留前15个,然后在后边加 “ … ”

(5)在控制台打印遍历出经过处理的新闻标题;

public class HomeWork{
    public static void main(String[] args){
        ArrayList arrayList = new ArrayList();
        arrayList.add(new News("新冠确诊病例超千万,数百万印度教信徒赴恒河\"圣浴\"引民众担忧"));
        arrayList.add(new News("男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生"));
        int size = arrayList.size();
        for (int i= size -1; i>= 0; i--){
            News news = (News)arrayList.get(i);
            System.out.println(processTitle(news.getTitle()));
        }
    }
    
    //专门写一个方法处理显示新闻标题
    public static String processTitle(String title){
        if(title == null) {
        	return "";
        }
        
        if(title.length() > 15){
        	return title.substring(0, 15)+"..."; //[0,15)
        } else
        	return title;
        }
}

class News{
    private String title;
    private String content;
    //get/set方法省略
    //toString方法只需要title
}

试分析 HashSet 和 TreeSet 分别如何实现去重的
(1) HashSet的去重机制:hashCode() + equals() ,底层先通过存入对象,进行运算得到一个hash值,通过hash值得到对应的索引,如果发现table索引所在的位置,没有数据,就直接存放;如果有数据,就进行equals比较[遍历比较],如果比较后,不相同,就加入,否则就不加入.

(2)TreeSet的去重机制:如果你传入了一个 Comparator 匿名对象,就使用实现的compare去重,如果方法返回0,就认为是相同的元素/数据,就不添加;如果你没有传入一个 Comparator 匿名对象,则以你添加的对象实现的 Compareable 接口的 compareTo 去重.

下面两句是否会抛出异常

TreeSet treeSet = new TreeSet();//分析源码
treeSet.add(new Person());

//CLassCastException.
//add 方法,因为 TreeSet()构造器没有传入Comparator接口的匿名内部类
//所以在底层 Comparable<? super K> k=(Comparable<? super K>) key;
//即把 Perosn转成 Comparable类型,但无法转成功


//如果防止报错,需要让Person实现接口
class Person implements Comparable{
}

已知:Person类按照id和name重写了hashCode利equals方法,问下面代码输出什么?

HashSet set = new HashSet();
Person p1= new Person(1001,"AA");
Person p2= new Person(1002,"BB");
set.add(p1);
set.add(p2);
p1.name ="CC";
set.remove(p1);//无法成功删除p1,因为更改后的1001,CC和原先100,AA,两者的编码不相同,位置不一样,找不到更新后的位置无法成功删除
System.out.println(set);//输出两个对象
set.add(new Person(1001,"CC"));
System.out.println(set);//三个对象,两个new Person不是同一对象
set.add(new Person(1001, "AA"));//挂到p1后面
System.out.println(set);//四个对象
集合 7.1
posted @ 2025-09-02 13:04  lu璐  阅读(3)  评论(0)    收藏  举报