JavaSEDemo23集合

秒速五厘米 2021-09-25 07:46 345阅读 0赞

文章目录

  • 简介
    • 树删除元素
    • 树的先序 中序 后续遍历
  • 集合
  • Collection接口
    • List接口
      • 特点
      • 常用方法
    • 通过实现类ArrayList实现对上述方法的使用
    • add方法、addAll方法和clear方法
    • remove(int index)方法
    • remove(Object obj)方法
    • removeAll方法
    • set方法、size方法和isEmpty()方法
    • contains方法
    • containsAll方法
    • indexOf方法
    • toArray方法
    • get方法
    • 普通for循环
    • 增强for循环
    • iterator
    • listIterator
    • 普通for循环删除

简介

  • 本文是2021/04/22整理的笔记
  • 赘述可能有点多,还请各位朋友耐心阅读
  • 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进

树删除元素

  1. //删除结点的方法
  2. public void delete(int key) throws Exception{
  3. //创建当前结点和它的父结点
  4. Node parent = null;
  5. Node current = root;
  6. //如果要删除的结点是根结点
  7. if(key == root.key){
  8. parent = root;
  9. root = root.left;
  10. if(root.right !=null){
  11. Node temp = root.right;
  12. while(temp.right !=null){
  13. temp =temp.right;
  14. }
  15. temp.right = parent.right;
  16. }
  17. }else {
  18. while (key != current.key) {
  19. parent = current;
  20. if (key < current.key) {
  21. current = current.left;
  22. }
  23. if (key > current.key) {
  24. current = current.right;
  25. }
  26. if (current == null) {
  27. throw new IllegalStateException("没有找到与key值匹配的结点");
  28. }
  29. }
  30. //如果要删除的结点在父结点的左侧
  31. if(parent.left == current){
  32. //删除结点:跳过父结点的原左结点
  33. if(current.left != null){
  34. parent.left = current.left;
  35. //如果被删除的结点的右子树不为空
  36. if(current.right != null){
  37. //创建临时结点:赋的值是删除结点后,父结点的新的左结点
  38. Node temp = parent.left;
  39. //如果该结点的右子树不为空,则一直右移,直到为空
  40. while(temp.right != null){
  41. temp = temp.right;
  42. }
  43. temp.right = current.right;
  44. }
  45. }else {
  46. parent.left = current.right;
  47. }
  48. }//反之右侧
  49. else {
  50. if (current.right != null) {
  51. //删除结点:跳过父结点的原右结点
  52. parent.right = current.right;
  53. //如果被删除的结点的左子树不为空
  54. if (current.left != null) {
  55. //创建临时结点:赋的值是删除结点后,父结点的新的右结点
  56. Node temp = parent.right;
  57. //如果该结点的左子树不为空,则一直左移,直到为空
  58. while (temp.left != null) {
  59. temp = temp.left;
  60. }
  61. temp.left = current.left;
  62. }
  63. }else {
  64. parent.right = current.left;
  65. }
  66. }
  67. }
  68. }

树的先序 中序 后续遍历

  1. /** *先序遍历二叉树 * @param node * @throws Exception */
  2. public static void preOrder(Node node) throws Exception{
  3. if(node!=null){
  4. System.out.println(node.key);
  5. preOrder(node.left);
  6. preOrder(node.right);
  7. }
  8. }
  9. /** *中序遍历二叉树 * @param node * @throws Exception */
  10. public static void midOrder(Node node) throws Exception{
  11. if(node!=null){
  12. midOrder(node.left);
  13. System.out.println(node.key);
  14. midOrder(node.right);
  15. }
  16. }
  17. /** *后序遍历二叉树 * @param node * @throws Exception */
  18. public static void laterOrder(Node node) throws Exception{
  19. if(node!=null){
  20. laterOrder(node.left);
  21. laterOrder(node.right);
  22. System.out.println(node.key);
  23. }
  24. }

集合

Collection接口

List接口

特点

  • 有序
  • 重复

常用方法

  • add(E e) 向列表的尾部添加指定的元素
  • add(int index,E element) 在列表的指定位置添加指定的元素
  • addAll(Collection<? extends E> c) 添加指定collection中的所有元素到此列表的结尾。
  • addAll(int index,Collection<? extends E> c) 将指定 collection 中的所有元素都插入
    到列表中的指定位置
  • clear() 从列表中移除所有元素
  • contains(Object o) 如果列表包含指定的元素,则返回 true
  • containsAll(Collection<?> c) 如果列表包含指定 collection 的所有元素,则返回 true
  • equals(Object o) 比较指定的对象与列表是否相等
  • get(int index) 返回值列表中指定位置的元素
  • indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果不包含此元素,返回-1
  • isEmpty() 如果列表为空,返回true
  • iterator() 返回按适当顺序在列表的元素上进行迭代的迭代器。
  • listIterator( ) 返回此列表元素的列表迭代器
  • remove(int index) 移除列表中指定位置的元素
  • remove(Object o) 移除列表中第一次出现的指定元素
  • set(int index,E element) 用指定元素替换列表中指定位置的元素
  • size() 返回列表中的元素数

通过实现类ArrayList实现对上述方法的使用

add方法、addAll方法和clear方法

  1. @Test
  2. public void test() {
  3. //创建对象
  4. ArrayList<Integer> arrayList1 = new ArrayList<>();
  5. arrayList1.add(10);
  6. arrayList1.add(30);
  7. arrayList1.add(20);
  8. arrayList1.add(50);
  9. arrayList1.add(40);
  10. arrayList1.add(70);
  11. arrayList1.add(1, 100);
  12. //打印集合
  13. System.out.println(arrayList1);
  14. ArrayList<Integer> arrayList2 = new ArrayList<>();
  15. arrayList2.add(1);
  16. arrayList2.add(2);
  17. arrayList2.add(3);
  18. arrayList2.add(4);
  19. arrayList2.add(5);
  20. boolean b = arrayList2.addAll(1, arrayList1);
  21. System.out.println("b = " + b);
  22. System.out.println(arrayList2);
  23. arrayList2.clear();
  24. System.out.println("arrayList2 = " + arrayList2);
  25. }

remove(int index)方法

  1. @Test
  2. public void testRemove() {
  3. ArrayList<Integer> list = new ArrayList<>();
  4. list.add(10);
  5. list.add(20);
  6. list.add(30);
  7. list.add(40);
  8. list.add(50);
  9. System.out.println(list);
  10. Integer remove = list.remove(1);
  11. System.out.println("remove = " + remove);
  12. System.out.println(list);
  13. }

remove(Object obj)方法

  • 因为remove方法有两种重载形式,所以List的remove(Object obj) 需要包装一下
    例如:list.remove(new Integer(“20”));

    @Test

    1. public void testRemove2() {
    2. ArrayList<Integer> list = new ArrayList<>();
    3. list.add(10);
    4. list.add(20);
    5. list.add(30);
    6. boolean b = list.remove(new Integer("20"));
    7. System.out.println("b = " + b);
    8. System.out.println("list = " + list);
    9. }

removeAll方法

  1. @Test
  2. public void testRemoveAll() {
  3. ArrayList<Integer> list1 = new ArrayList<>();
  4. ArrayList<Integer> list2 = new ArrayList<>();
  5. list1.add(10);
  6. list1.add(20);
  7. list1.add(30);
  8. list1.add(40);
  9. list1.add(50);
  10. list1.add(60);
  11. list1.add(70);
  12. list1.add(80);
  13. list2.add(20);
  14. list2.add(30);
  15. System.out.println(list1);
  16. list1.removeAll(list2);
  17. System.out.println(list1);
  18. }

set方法、size方法和isEmpty()方法

  1. @Test
  2. //替换指定索引处的元素
  3. public void testSet() {
  4. ArrayList<Integer> list = new ArrayList<>();
  5. list.add(10);
  6. list.add(20);
  7. list.add(30);
  8. list.set(1, 50);
  9. System.out.println(list);
  10. System.out.println(list.size());
  11. System.out.println(list.isEmpty());
  12. }

contains方法

  1. @Test
  2. public void testContains(){
  3. ArrayList<Integer> list = new ArrayList<>();
  4. list.add(10);
  5. list.add(20);
  6. list.add(30);
  7. list.add(40);
  8. list.add(50);
  9. list.add(60);
  10. System.out.println(list.contains(30));
  11. }

containsAll方法

  1. @Test
  2. public void testContainsAll(){
  3. ArrayList<Integer> list1 = new ArrayList<>();
  4. ArrayList<Integer> list2 = new ArrayList<>();
  5. list1.add(10);
  6. list1.add(20);
  7. list1.add(30);
  8. list1.add(40);
  9. list1.add(50);
  10. list1.add(60);
  11. list1.add(70);
  12. list2.add(10);
  13. list2.add(20);
  14. System.out.println("list1.containsAll(list2) = " + list1.containsAll(list2));
  15. }

indexOf方法

  1. @Test
  2. public void testIndexOf(){
  3. ArrayList<Integer> list = new ArrayList<>();
  4. list.add(10);
  5. list.add(20);
  6. list.add(30);
  7. list.add(40);
  8. list.add(50);
  9. list.add(20);
  10. list.add(20);
  11. list.add(20);
  12. list.add(20);
  13. list.add(20);
  14. System.out.println("list.indexOf(20) = " + list.indexOf(20));
  15. System.out.println("list.indexOf(200) = " + list.indexOf(200));
  16. System.out.println("list.lastIndexOf(20) = " + list.lastIndexOf(20));
  17. }

toArray方法

  1. @Test
  2. public void testToArray(){
  3. ArrayList<Integer> list = new ArrayList<>();
  4. list.add(10);
  5. list.add(20);
  6. list.add(30);
  7. list.add(40);
  8. list.add(50);
  9. list.add(60);
  10. list.add(70);
  11. list.add(80);
  12. Object[] array = list.toArray();
  13. for (int i = 0; i < array.length; i++) {
  14. System.out.print(array[i] + " ");
  15. }
  16. }

get方法

  1. @Test
  2. public void testGet(){
  3. ArrayList<Integer> list = new ArrayList<>();
  4. list.add(10);
  5. list.add(20);
  6. list.add(30);
  7. System.out.println("list.get(1) = " + list.get(1));
  8. }

普通for循环

  1. @Test
  2. public void testFor(){
  3. ArrayList<Integer> list = new ArrayList<>();
  4. list.add(10);
  5. list.add(20);
  6. list.add(30);
  7. list.add(40);
  8. list.add(50);
  9. for (int i = 0; i < list.size(); i++) {
  10. Integer integer = list.get(i);
  11. System.out.println("integer = " + integer);
  12. }
  13. }

增强for循环

  1. @Test
  2. public void testEach(){
  3. ArrayList<Integer> list = new ArrayList<>();
  4. list.add(10);
  5. list.add(20);
  6. list.add(30);
  7. list.add(40);
  8. list.add(50);
  9. for (Integer integer : list) {
  10. System.out.println("integer = " + integer);
  11. }
  12. }

iterator

  1. @Test
  2. public void testIterator(){
  3. ArrayList<Integer> list = new ArrayList<>();
  4. list.add(10);
  5. list.add(20);
  6. list.add(30);
  7. list.add(40);
  8. list.add(50);
  9. Iterator<Integer> iterator = list.iterator();
  10. //hasNext表示是否有下一个元素
  11. while(iterator.hasNext()){
  12. //next表示下一个元素
  13. Integer next = iterator.next();
  14. System.out.println("next = " + next);
  15. }
  16. }

listIterator

  • 先正序 才能逆序

    @Test

    1. public void testListIterator(){
    2. ArrayList<Integer> list = new ArrayList<>();
    3. list.add(10);
    4. list.add(20);
    5. list.add(30);
    6. list.add(40);
    7. list.add(50);
    8. ListIterator<Integer> iterator = list.listIterator();
    9. //hasNext表示是否有下一个元素
    10. while(iterator.hasNext()){
    11. //next表示下一个元素
    12. Integer next = iterator.next();
    13. System.out.println("next = " + next);
    14. }
    15. System.out.println("===========================");
    16. while(iterator.hasPrevious()){
    17. Integer previous = iterator.previous();
    18. System.out.println("previous = " + previous);
    19. }
    20. }

普通for循环删除

  1. @Test
  2. public void testForDel(){
  3. ArrayList<Integer> list = new ArrayList<>();
  4. list.add(10);
  5. list.add(20);
  6. list.add(30);
  7. for (int i = 0; i < list.size(); i++) {
  8. System.out.println("list.get(i) = " + list.get(i));
  9. list.remove(0);
  10. }
  11. System.out.println(list);
  12. }

发表评论

表情:
评论列表 (有 0 条评论,345人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JavaSEDemo06

    文章目录 简介 显示继承与隐式继承 继承的重点 继承与构造方法 继承的优点和缺点 final关键字 多重继承时构造方法的执行情况

    相关 JavaSEDemo05

    文章目录 简介 void方法中return语句的使用规范 可变API与不可变API 数据交换与方法传参 为什么不能用返回值类型来判断方法是否