一、要求
1:首先将3猴子3狗熊3鸭子放到集合里
2:转成list,然后排序,先猴子再狗熊然后鸭子,同类的先类别再名字最后年龄,
3:按名字建索引 map key value list
4:map 存盘
二、实现
最后存盘效果图
重点是:
- 设计类之间的关系,重写hashCode、equals、toString等方法
- 实现排序需求需要实现Compareable接口,重写compareTo方法,完成 不同类 对象间的比较、同类对象不同属性 间的比较
- 如何实现Map 中 name 和 多个对象 之间的映射关系
- Map转化为Properties 然后写入磁盘
三、代码
- Animal
package xiaosi.demo;
import java.util.Objects;
public abstract class Animal implements Comparable {
public String name;
public int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public abstract void draw();
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Animal animal = (Animal) o;
return age == animal.age &&
Objects.equals(name, animal.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
enum AniamKind{
GAOYUDUKC,JIANCHANGDUCK,DAYUDUCK,KUNSHANDUCK,
BIGBROWNBREAR,AMERICALBEAR,EYEBEAR,INDAIBEAR,
FOXMONKEY,LAZYMONKEY,BABYMONKEY,FINGERMONKEY
}
}
- Monkey
package xiaosi.demo;
import java.util.Objects;
public class Monkey extends Animal implements Comparable{
private AniamKind kind;
public Monkey(String name, int age, AniamKind kind) {
super(name, age);
this.kind = kind;
}
@Override
public void draw() {
System.out.println(" ◢█◣▄▄▅▅▄▄◢█◣ ");// 1
System.out.println(" ◢████████████◣ ");// 2
System.out.println(" ███████████████ ");// 1
System.out.println(" ██ ◥██◤ ██ ");// 2
System.out.println(" ◢███ ◥◤ ██◣");// 1
System.out.println(" ▊▎██◣ ◢█▊▊ ");// 2
System.out.println(" ▊▎██◤ ● ● ◥█▊▊ ");// 1
System.out.println("我是" + name + " 年龄为:" + age + " 种类为:" + kind);
System.out.println(" ▊ ██ █▊▊ ");// 2
System.out.println(" ◥▇██ ▊ ▊ █▇◤");// 1
System.out.println(" ██ ◥▆▄▄▄▄▆◤ █▊ ◢▇▇◣");// 2
System.out.println("◢██◥◥▆▅▄▂▂▂▂▄▅▆███◣▊◢ █");// 1
System.out.println("█╳ ╳█◥◤◢◤");// 2
System.out.println("◥█◣ ˙ ˙ ◢█◤ ◢◤ ");// 1
System.out.println(" ▊ █ ◢◤");// 2
System.out.println(" ▊ ▊ ◢◤");// 1
System.out.println(" ▊ █▇▇▇◤ ");// 2
System.out.println(" ◢█▇▆▆▆▅▅▅▅▆▆▆▇█◣ ");// 1
System.out.println(" ▊ ▂ ▊ ▊ ▂ ▊ ");// 2
System.out.println(" ◥▆▆▆◤ ◥▆▆▆◤");// 1
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
Monkey monkey = (Monkey) o;
return kind == monkey.kind;
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), kind);
}
@Override
public String toString() {
//draw();
return "Monkey{" +
"kind=" + kind +
", name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Object o) {
if(o instanceof Monkey){
//种类不同,比种类
if(!this.kind.equals(((Monkey) o).kind)){
if(this.kind.compareTo(((Monkey) o).kind) > 0){
return 1;
}
else{
return -1;
}
} //种类相同,比名字
else {
//名字不同
if(!this.name.equals(((Monkey) o).name)){
if(this.name.compareTo(((Monkey) o).name) > 0){
return 1;
}
else{
return -1;
}
}
//种类、名字都相同,比年龄
else{
return this.age - ((Monkey)o).age;
}
}
}
else if(o instanceof Bear){
return -1;
}
else if(o instanceof Duck){
return -1;
}
return 0;
}
}
- Duck
package xiaosi.demo;
public class Duck extends Animal implements Comparable{
private AniamKind kind;
public Duck(String name, int age, AniamKind kind) {
super(name, age);
this.kind = kind;
}
@Override
public void draw() {
System.out.println(" ,----, ");
System.out.println(" ___.` `, ");
System.out.println(" `=== D : ");
System.out.println(" `’. .’ ");
System.out.println(" ) ( , ");
System.out.println(" / \\_________________/| ");
System.out.println(" / | ");
System.out.println("我是" + name + " 年龄为:" + age + " 种类为:" + kind);
System.out.println(" | ; ");
System.out.println(" | _____ / ");
System.out.println(" | \\ ______7 ,’ ");
System.out.println(" | \\ ______7 / ");
System.out.println(" \\ `-,____7 ,’ ");
System.out.println("^~^~^~^`\\ /~^~^~^~^ ");
System.out.println(" ~^~^~^ `----------------’ ~^~^~^ ");
}
@Override
public String toString() {
// draw();
return "Duck{" +
"kind=" + kind +
", name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Object o) {
if(o instanceof Duck){
//种类不同,比种类
if(!this.kind.equals(((Duck) o).kind)){
if(this.kind.compareTo(((Duck) o).kind) > 0){
return 1;
}
else{
return -1;
}
} //种类相同,比名字
else {
//名字不同
if(!this.name.equals(((Duck) o).name)){
if(this.name.compareTo(((Duck) o).name) > 0){
return 1;
}
else{
return -1;
}
}
//种类、名字都相同,比年龄
else{
return this.age - ((Duck)o).age;
}
}
}
else if(o instanceof Monkey){
return 1;
}
else if(o instanceof Bear){
return 1;
}
return 0;
}
}
- Bear
package xiaosi.demo;
import java.util.Objects;
public class Bear extends Animal implements Comparable{
private AniamKind kind;
public Bear(String name, int age, AniamKind kind) {
super(name, age);
this.kind = kind;
}
@Override
public void draw() {
System.out.println("┴┬┴┬/ ̄\_/ ̄\");
System.out.println("┬┴┬┴▏ ▏▔▔▔▔\");
System.out.println("┴┬┴/\ / ﹨");
System.out.println("┬┴∕ / )");
System.out.println("我是" + name + " 年龄为:" + age + " 种类为:" + kind);
System.out.println("┴┬▏ ● ▏");
System.out.println("┬┴▏ ▔█ ");
System.out.println("┴◢██◣ /\__/ ");
System.out.println("┬█████◣ / ");
System.out.println("┴█████████████◣ ");
System.out.println("◢██████████████▆▄");
System.out.println("█◤◢██◣◥█████████◤\ ");
System.out.println("◥◢████ ████████◤ \");
System.out.println("┴█████ ██████◤ ﹨");
System.out.println("┬│ │█████◤ ▏");
System.out.println("┴│ │ ▏");
System.out.println("┬∕ ∕ /▔▔▔\ ∕");
System.out.println("*∕___/﹨ ∕ \ /\");
System.out.println("┴┬┴┬┴┬┴ \___ \ ﹨/▔\﹨/▔\");
System.out.println("▲△▲▲╓╥╥╥╥╥╥╥╥\ ∕ /▔﹨ /▔");
System.out.println("***╠╬╬╬╬╬╬╬╬*﹨ / // /");
System.out.println("(\/)*(\/)** △▲▲﹨/__//__");
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
Bear bear = (Bear) o;
return kind == bear.kind;
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), kind);
}
@Override
public String toString() {
//draw();
return "Bear{" +
"kind=" + kind +
", name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Object o) {
if(o instanceof Bear){
//种类不同,比种类
if(!this.kind.equals(((Bear) o).kind)){
if(this.kind.compareTo(((Bear) o).kind) > 0){
return 1;
}
else{
return -1;
}
} //种类相同,比名字
else {
//名字不同
if(!this.name.equals(((Bear) o).name)){
if(this.name.compareTo(((Bear) o).name) > 0){
return 1;
}
else{
return -1;
}
}
//种类、名字都相同,比年龄
else{
return this.age - ((Bear)o).age;
}
}
}
else if(o instanceof Monkey){
return 1;
}
else if(o instanceof Duck){
return -1;
}
return 0;
}
}
- TestMain
package xiaosi.demo;
import java.io.*;
import java.util.*;
public class TestMain {
public static void main(String[] args) throws IOException {
Set<Animal> mySet = new HashSet<>();
//1. 创建对象
Duck d1 = new Duck("Tom",1, Animal.AniamKind.GAOYUDUKC );
Duck d2 = new Duck("Jack",2, Animal.AniamKind.JIANCHANGDUCK );
Duck d3 = new Duck("Tom",2, Animal.AniamKind.GAOYUDUKC );
Monkey m1 = new Monkey("Tom",5, Animal.AniamKind.JIANCHANGDUCK);
Monkey m2 = new Monkey("Jack",2, Animal.AniamKind.LAZYMONKEY);
Monkey m3 = new Monkey("Jack",1, Animal.AniamKind.LAZYMONKEY);
Bear b1 = new Bear("Tom",5, Animal.AniamKind.BIGBROWNBREAR);
Bear b2 = new Bear("Jack",5, Animal.AniamKind.AMERICALBEAR);
Bear b3 = new Bear("b",6, Animal.AniamKind.EYEBEAR);
//1. 放入mySet
mySet.add(d1);
mySet.add(d2);
mySet.add(d3);
mySet.add(m1);
mySet.add(m2);
mySet.add(m3);
mySet.add(b1);
mySet.add(b2);
mySet.add(b3);
// System.out.println(mySet);
/**
* 遍历mySet放入List
List<Animal> myList = new ArrayList<>();
for (Animal animal : mySet) {
myList.add(animal);
}
*/
//2. Set转化为List
List<Animal> myList = new ArrayList<>(mySet);
//System.out.println(myList);
//2. 排序
Collections.sort(myList);
//System.out.println(myList);
//3. 按名字建索引
Map<String,List<Animal>> myMap = new HashMap<>();
//遍历每个mySet的name
for (Animal animal : mySet) {
//list存放对象
List<Animal> list = null;
String nameKey = animal.name;
//将name相等的对象放到list中
list = new ArrayList<>();
for (Animal animal1 : myList) {
if(nameKey.equals(animal1.name)){
list.add(animal1);
}
}
//放到map中
myMap.put(nameKey,list);
}
//System.out.println(myMap);
//3. 遍历每个map对应的每个value打印
//4. map转为properties存储起来
Properties pro = new Properties();
Set<Map.Entry<String, List<Animal>>> entries = myMap.entrySet();
for (Map.Entry<String, List<Animal>> entry : entries) {
System.out.println("name :" + entry.getKey());
//value为对应的多个对象,是个list集合
List<Animal> value = entry.getValue();
//遍历每个对象并打印
for (Animal animal : value) {
System.out.println("name 为 " + entry.getKey() + "的有:" +animal);
}
//将map的每一项转为properties
pro.setProperty(entry.getKey(),value.toString());
System.out.println("================");
}
System.out.println(pro);
//4. IO写入pro到本地
// 4.1 类加载器获取路径
String path = TestMain.class.getResource("/").getPath();
path += "animal.properties";
// System.out.println(path);
File f = new File("animal.properties");
FileOutputStream fos = null;
//抓一下异常
try {
fos = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 4.2 写入
pro.store(fos,"GroupByAnimalName");
}
}
四、小结
4.1 List、Set、Array等之间互转的方法
1. Array—>List
- 栗子
String[] staffs = new String[]{
"A", "B", "C"};
List staffsList = Arrays.asList(staffs);
2. Array—>List—>Set
- 栗子
String[] staffs = new String[]{
"A", "B", "C"};
Set<String> staffsSet = new HashSet<>(Arrays.asList(staffs));
staffsSet.add("D"); // ok
staffsSet.remove("Tom"); // ok
3. Set、List—>Array
- 举栗
Object[] result = staffsList.toArray();
4. Set---->List
扫描二维码关注公众号,回复:
13141386 查看本文章

- 举栗
List<String> result = new ArrayList<>(staffsSet);
4.2IO写出Properties到磁盘
//4. IO写入pro到本地
// 4.1 类加载器获取路径
String path = TestMain.class.getResource("/").getPath();
path += "animal.properties";
// System.out.println(path);
File f = new File("animal.properties");
FileOutputStream fos = null;
//抓一下异常
try {
fos = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 4.2 写入
pro.store(fos,"GroupByAnimalName");