集合的家庭作业

Homework01

按要求实现:

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

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

新闻一:新冠确诊病例超千万,数百万印度教信徒赴恒河“圣浴”引民众担忧
新闻二:男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生

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

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

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

自己写的

package com.yt.collectionhomework;

import java.util.ArrayList;
import java.util.Iterator;

public class Homework01 {
    public static void main(String[] args) {
        News news1 = new News("新冠确诊病例超千万,数百万印度教信徒赴恒河“圣浴”引民众担忧");
        News news2 = new News("男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生");

        ArrayList arrayList = new ArrayList();
        arrayList.add(news1);
        arrayList.add(news2);
        System.out.println("arrayList=" + arrayList);

        //实现倒序遍历
        System.out.print("倒序遍历");
        for (int i = arrayList.size()-1; i >= 0; i--) {
            System.out.print(arrayList.get(i));
        }


        System.out.println();
        System.out.println();
        Iterator iterator = arrayList.iterator();
        while (iterator.hasNext()){
            Object next = iterator.next();
            //向下转型为News对象,方便获得title的字符串
            String str = ((News)next).getTitle();
            if (str.length() > 15){
                System.out.println(str.substring(0, 15) + "...");
            }
        }

    }
}
class News{
    private String title;
    private String content;

    public News(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return "\nNews{" +
                "title='" + title + '\'' +
                '}';
    }
}

对比老师写的

重写写一个方法来处理标题的内容,这种重新写方法的思想要建立

import java.util.ArrayList;


public class Homework01 {
    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--) {
            //System.out.println(arrayList.get(i));
            News news = (News)arrayList.get(i);
            System.out.println(processTitle(news.getTitle()));
        }

    }
    //专门写一个方法,处理现实新闻标题 process处理
    public static String processTitle(String title) {

        if(title == null) {
            return "";
        }

        if(title.length() > 15) {
            return title.substring(0, 15) + "..."; //[0,15)
        } else {
            return title;
        }

    }
}

/**
 * 按要求实现:
 * (1) 封装一个新闻类,包含标题和内容属性,提供get、set方法,重写toString方法,打印对象时只打印标题;
 * (2) 只提供一个带参数的构造器,实例化对象时,只初始化标题;并且实例化两个对象:
 * 新闻一:新冠确诊病例超千万,数百万印度教信徒赴恒河“圣浴”引民众担忧
 * 新闻二:男子突然想起2个月前钓的鱼还在网兜里,捞起一看赶紧放生
 * (3) 将新闻对象添加到ArrayList集合中,并且进行倒序遍历;
 * (4) 在遍历集合过程中,对新闻标题进行处理,超过15字的只保留前15个,然后在后边加“…”
 * (5) 在控制台打印遍历出经过处理的新闻标题;
 */
class News {
    private String title;
    private String content;

    public News(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return "News{" +
                "title='" + title + '\'' +
                '}';
    }
}

Homework02

使用ArrayList完成对对象Car {name, price}的各种操作

l.add:添加单个元素

2.remove:删除指定元素

3.contains:查找元素是否存在

4.size:获取元素个数

5.isEmpty:判断是否为空

6.clear:清空

7.addAll:添加多个元素

8.containsAll:查找多个元素是否都存在

9.removeAll:删除多个元素

使用增强for和迭代器来遍历所有的car,需要重写Car的toString方法

Car car = new Car(“宝马",400000);

Car car2 = new Car(“宾利".5000000);

package com.yt.collectionhomework;

import java.util.ArrayList;
import java.util.Iterator;

public class Homework02 {
    public static void main(String[] args) {
        Car car = new Car("宝马", 400000);
        Car car1 = new Car("宾利", 5000000);
        ArrayList list = new ArrayList();
        //添加单个元素
        list.add(car);
        list.add(car1);
        System.out.println("list=" + list);

        //删除指定元素
        list.remove(1);
        System.out.println("list=" + list);

        //查找元素是否存在,判断的是对象
        System.out.println(list.contains(car));

        //获取元素个数
        System.out.println(list.size());

        //判断是否为空
        System.out.println(list.isEmpty());

        //添加多个元素
        ArrayList list1 = new ArrayList();
        list1.add("hello1");
        list1.add("你好啊");
        list.addAll(list1);
        System.out.println("list=" + list);

        //查找多个元素是否存在
        System.out.println(list.containsAll(list1));

        //删除多个元素


        //使用增强for来遍历
        for (Object obj : list){
            System.out.println(obj);
        }

        //使用迭代器遍历
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);

        }

    }
}
class Car{
    private String name;
    private double price;

    public Car(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

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

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

Homework03

按要求完成下列任务

1)使用HashMap类实例化一个Map类型的对象m,键(String)和值(int);分别用于存储员工的姓名和工资,存入数据如下:

jack—650元; tom—1200元;smith——2900元;

2)将jack的工资更改为2600元

3)为所有员工工资加薪100元;

4)遍历集合中所有的员工;

package com.yt.collectionhomework;

import java.util.*;

public class Homework03 {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("jack",new Emp("jack",650));
        map.put("tom",new Emp("tom",1200));
        map.put("smith",new Emp("smith",2900));

        System.out.println("map=" + map);

        //将jack的工资更改为2600元
        map.replace("jack",new Emp("jack",2600));
        System.out.println(map);

        //为所有员工工资加薪100元;
        //使用循环来完成
        Set keySet0 = map.keySet();
        for (Object obj : keySet0){
            Emp e = (Emp)map.get(obj);
            double newSalay = e.getSalary()+100;
            System.out.println(obj + "-" +newSalay);
        }

        //遍历集合中所有的员工
        Set keySet = map.keySet();
        for (Object obj : keySet){
            System.out.println(obj + "-" + map.get(obj));
        }

        Collection values = map.values();
        for (Object obj : values){
            System.out.println(obj);
        }

        Set entrySet = map.entrySet();
        Iterator iterator = entrySet.iterator();
        while (iterator.hasNext()) {
            Map.Entry next =  (Map.Entry)iterator.next();
            System.out.println(next);
        }
    }
}
class Emp{
    private String name;
    private double salary;

    public Emp(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

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

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "name='" + name + '\'' +
                ", salary=" + salary +
                "}\n";
    }
}

老师写的

为所有员工工资加薪100元;这个地方思考不一样

import java.util.*;

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

        Map m = new HashMap();
        m.put("jack", 650);//int->Integer
        m.put("tom", 1200);//int->Integer
        m.put("smith", 2900);//int->Integer
        System.out.println(m);

        m.put("jack", 2600);//替换,更新
        System.out.println(m);

        //为所有员工工资加薪100元;
        //keySet
        Set keySet = m.keySet();
        for (Object key : keySet) {
            //更新
            m.put(key, (Integer)m.get(key) + 100);
        }
        System.out.println(m);

        System.out.println("=============遍历=============");
        //遍历 EntrySet
        Set entrySet = m.entrySet();
        //迭代器
        Iterator iterator = entrySet.iterator();
        while (iterator.hasNext()) {
            Map.Entry entry =  (Map.Entry)iterator.next();
            System.out.println(entry.getKey() + "-" + entry.getValue());

        }

        System.out.println("====遍历所有的工资====");
        Collection values = m.values();
        for (Object value : values) {
            System.out.println("工资=" + value);
        }

    }
}
/**
 * 按要求完成下列任务
 * 1)使用HashMap类实例化一个Map类型的对象m,键(String)和值(int)分别用于存储员工的姓名和工资,
 * 存入数据如下: jack—650元;tom—1200元;smith——2900元;
 * 2)将jack的工资更改为2600元
 * 3)为所有员工工资加薪100元;
 * 4)遍历集合中所有的员工
 * 5)遍历集合中所有的工资
 */

Homework04

试分析HashSet和TreeSet分别如何实现去重的

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

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

Homework05

下面代码运行会不会抛出异常,并从源码层面说明原因.[考察读源码+接口编程+动态绑定]

TreeSet treeSet = new TreeSet);
treeSet.add(new Person0);

import java.util.TreeSet;

public class Homework05 {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();
        //分析源码
        //add 方法,因为 TreeSet() 构造器没有传入Comparator接口的匿名内部类
        //所以在底层 Comparable<? super K> k = (Comparable<? super K>) key;
        //即 把 Perosn转成 Comparable类型,但是创建的Person类并没有实现Comparable接口
        //补充:String 实现了Comparable接口,因此在传入相同字符串的时候不能重复
        treeSet.add(new Person());//ClassCastException.
        treeSet.add(new Person());//ClassCastException.
        treeSet.add(new Person());//ClassCastException.
        treeSet.add(new Person());//ClassCastException.
        treeSet.add(new Person());//ClassCastException.

        System.out.println(treeSet);

    }
}

class Person {
   
}

如何解决上述问题呢?

import java.util.TreeSet;

public class Homework05 {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();
        //分析源码
        //add 方法,因为 TreeSet() 构造器没有传入Comparator接口的匿名内部类
        //所以在底层 Comparable<? super K> k = (Comparable<? super K>) key;
        //即 把 Perosn转成 Comparable类型,但是创建的Person类并没有实现Comparable接口
        //补充:String 实现了Comparable接口,因此在传入相同字符串的时候不能重复
        treeSet.add(new Person());
        treeSet.add(new Person());
        treeSet.add(new Person());
        treeSet.add(new Person());
        treeSet.add(new Person());

        System.out.println(treeSet);//返回1
        //因为compareTo方法返回的值都一样,没有做比较处理

    }
}

class Person implements Comparable{

    @Override
    public int compareTo(Object o) {
        return 0;
    }
}

Homework06

1671801330975

import java.util.HashSet;
import java.util.Objects;


public class Homework06 {
    public static void main(String[] args) {
        HashSet set = new HashSet();//ok
        Person p1 = new Person(1001,"AA");//ok
        Person p2 = new Person(1002,"BB");//ok
        set.add(p1);//ok
        set.add(p2);//ok
        p1.name = "CC";
        set.remove(p1);//删除的时候也会hash
        System.out.println(set);//2,p1.name = "CC"之后p1的hash变化,无法删除
        set.add(new Person(1001,"CC"));
        System.out.println(set);//3
        set.add(new Person(1001,"AA"));
        System.out.println(set);//4

    }
}

class Person {
    public String name;
    public int id;

    public Person(int id, String name) {
        this.name = name;
        this.id = id;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return id == person.id &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, id);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", id=" + id +
                '}';
    }
}

试写出Vector和ArrayList的比较?

1671801923899

posted @ 2022-12-23 21:27  半路_出家ren  阅读(50)  评论(0编辑  收藏  举报
返回顶端