集める
コレクション紹介
コレクションは、同じ型の要素を統一された位置に配置できる拡張配列とみなすことができます。コレクションは、単一列コレクションと二重列コレクションに分類できます。
単一列コレクションの一般的なインターフェイスは Collection で、Collection から継承されるインターフェイスは List と Set です。List の要素は繰り返すことができますが、Set の要素は繰り返すことができません。List には、ArrayList と LinkedList という 2 つの実装クラスがあります。Set には、HashSet と TreeSet という 2 つの実装クラスがあります。
2 列コレクションの一般的なインターフェイスは Map で、Map の 2 つの実装クラスは HashMap と TreeMap です。
イテレータ
イテレーター
方法:
Iterator it = list.iterator();
it.hasNext();
it.next();
删除:
it.remove(); 用来删除该迭代器指向的元素。
iterator オブジェクトを取得し、その iterator オブジェクトを使用してデータを反復処理します (データ トラバーサル)。
package day01;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Demo01 {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<>();
coll.add("1");
coll.add("2");
coll.add("3");
coll.add("4");
coll.add("5");
// 获取迭代器对象 Iterator.利用Iterator的对象方法,hasNext判断是否有下一个,
// 使用next取出下一个元素
Iterator<String> iter = coll.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
}
}
next を使用する場合、反復子は現在ポイントされている要素を取得し、次の要素をポイントします。
セットコレクション
概述:
Set集合特点:
可以去除重复
存取顺序不一致
没有带索引的办法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里面的元素。
Set集合练习
存储字符串并遍历。
セット コレクションの基本的な使用法。セット コレクションを繰り返すことはできません。要素が繰り返される場合、そのうちの 1 つだけが保持されます。
一貫性のないアクセスシーケンス。Set にはインデックスがないため、通常の for ループは使用できません。
private static void demo02() {
Set<String> set = new HashSet<>();
set.add("Hello");
set.add("world");
set.add("Hello");
// 增强for循环
for (String s : set) {
System.out.println(s);
}
// 迭代器循环
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
ハッシュセット
底层使用哈希表
重写HashCode 和 equals方法。
ツリーセット
TreeSet集合特点
不包含重复元素的集合
没有带索引的方法
可以将元素按照规则进行排序
底层使用红黑树
必须给定排序规则。
ナチュラルソート
自然な並べ替えでは、比較可能なインターフェイスを実装し、その中で CompareTo メソッドを書き直す必要があります。これは現在並べ替えられているオブジェクトであり、o はすでにコレクション内にあるオブジェクトです。戻り値が < 0 の場合、これは次のようにする必要があることを意味します。左側、それ以外の場合は左側にある必要があります。右側、0 の場合、オブジェクトが複製されていることを意味し、操作は実行されません。
private static void demo04() {
Student s1 = new Student("陈歌", 18);
Student s2 = new Student("王文", 19);
Student s3 = new Student("双双", 18);
Student s4 = new Student("之言", 33);
TreeSet<Student> set = new TreeSet<>();
// 存入学生到TreeSet集合
set.add(s1);
set.add(s2);
set.add(s3);
set.add(s4);
for (Student s : set) {
System.out.print(s.getName() + " ");
System.out.println(s.getAge());
}
}
package day01;
//写一个学生类,并使用TreeSet集合来存储5个学生
//按照自定义的规则进行排序,自然排序
public class Student implements Comparable<Student> {
private String name;
private Integer age;
public Student(){
}
public Student(String name,Integer age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public int compareTo(Student o) {
int result = this.getAge() - o.getAge();
result = result == 0 ? this.getName().compareTo(o.getName()) : result;
return result;
}
}
コンパレータソート
コンパレータの並べ替えは Student オブジェクトではなくコレクションに記述され、コンパレータはコレクション内のパラメータ化されたメソッドで記述できます。比較メソッドをオーバーライドする。
private static void demo05() {
Teacher t1 = new Teacher("陈歌", 18);
Teacher t2 = new Teacher("犯花痴", 24);
Teacher t3 = new Teacher("风速", 20);
Teacher t4 = new Teacher("白色", 16);
TreeSet<Teacher> set = new TreeSet<>(new Comparator<Teacher>() {
@Override
public int compare(Teacher o1, Teacher o2) {
// 此时的o1就是即将进行排序的,o2是集合中已经排好序的。
int result = o1.getAge() - o2.getAge();
result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;
return result;
}
});
set.add(t1);
set.add(t2);
set.add(t3);
set.add(t4);
for (Teacher t : set) {
System.out.print(t.getName() + " ");
System.out.println(t.getAge());
}
}
2 つの比較方法の要約:
自然な並べ替え: カスタム クラスは Comparable インターフェイスを実装し、compareTo メソッドを書き換えて、戻り値に従って並べ替えます。
コンパレータの並べ替え: TreeSet を作成するときに、Compartor のコンパレータ オブジェクトを渡し、compare メソッドを書き換えて、戻り値に従って並べ替えます。
戻り値の規則:
戻り値 < 0 の場合は、現在格納されている値の方が小さいことを意味し、左側に格納されます。
= 0、現在保存されている値が繰り返されます。
戻り値は正の数で、現在格納されている値は右側に格納されているより大きな値です。
二分木
二分探索木
バランスが保てず、性能は保証されません。
バランスの取れた二分木
ノードを追加した後、二分木のバランスが崩れていないか確認し、リングのバランスが崩れている場合は、左右に回転させてバランスを取り直す必要があります。
左利き
右利き
赤黒い木
TreeSet の基礎となる原理は、赤と黒のツリーです。
赤黒木はバランスがあまり高くなく、赤黒ルールに従ってバランスが実現されています。
ルール:
每个节点是红色或黑色,根节点必须是黑色。
每个叶节点是黑色的
不能出现两个红色节点相连。
对每一个节点,到其所有后代叶结点的简单路径上,均包含相同数目的黑色节点。
地図コレクション
インターフェイス Map<K,V> K: キーのデータ型、V: 値のデータ型。
キーは繰り返すことができませんが、値は繰り返すことができます。
キーと値のペアは、Entry オブジェクトとも呼ばれます。
private static void demo06() {
// Map的使用
/*
put(K key,V value)
remove(Object key)
void clear()
boolean containsKey(Object key)
boolean isEmpty()
int size()
*/
Map<String, String> map = new HashMap<>();
map.put("1002", "王雯雯");
map.remove("1001");
map.clear();
map.put("1001", "赵新龙");
boolean flag = map.containsKey("1001");
System.out.println(flag);
System.out.println(map.size());
System.out.println(map);
}
キーと値のペアを反復処理する
最初の方法:(すべてのキーに従って値を取得)
private static void demo06() {
Map<String, String> map = new HashMap<>();
map.put("itheima01", "a");
map.put("itheima02", "b");
map.put("itheima03", "c");
map.put("itheima04", "d");
map.put("itheima05", "e");
// 获取所有的键
Set<String> set = map.keySet();
for (String key : set) {
String value = map.get(key);
System.out.println(key + " : " + value);
}
}
2 番目の方法: 各キーと値のペアを取得する
// 获取所有的entry
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String,String> entry : entries){
System.out.println(entry.getKey() + " " + entry.getValue());
}