第一百九十二节 Java集合教程 - Java导航集、Java列表

Java集合教程 - Java导航集

导航集是一个有序集,允许您使用其子集在各种方式。

NavigableSet 表示Java集合中的可导航集合框架。 NavigableSet 接口继承了SortedSet接口和扩展 SortedSet 

NavigableSet 界面可以以相反的顺序导航集合与SortedSet中定义的顺序相比。

headSet() tailSet() subSet() NavigableSet 接口接受布尔标志以将元素包括在子集边界的开始或结束处。

lower(),floor(),higher()和ceiling()从NavigableSet接口搜索基于搜索条件的元素。

lower()方法返回小于指定元素的最大元素。

floor()方法返回 NavigableSet 中小于或等于指定元素的最大元素。

higher()方法返回最小元素大于指定元素的 NavigableSet 

ceiling()方法返回 NavigableSet 中大于或等于指定元素的最小元素。

pollFirst() pollLast()分别检索和删除 NavigableSet 的第一个和最后一个元素。 如果NavigableSet为空,它们返回null。

TreeSet 类是 NavigableSet 接口的实现类之一。我们可以使用 TreeSet 作为集合,排序集合和可导航集合。

例子

import java.util.NavigableSet;
import java.util.TreeSet;

public class Main {
  public static void main(String[] args) {
    NavigableSet<Integer> ns = new TreeSet<>();
    ns.add(0);
    ns.add(1);
    ns.add(2);
    ns.add(3);
    ns.add(4);
    ns.add(5);
    ns.add(6);

    // Get a reverse view of the navigable set
    NavigableSet<Integer> reverseNs = ns.descendingSet();

    // Print the normal and reverse views
    System.out.println("Normal order: " + ns);
    System.out.println("Reverse order: " + reverseNs);

    NavigableSet<Integer> threeOrMore = ns.tailSet(3, true);
    System.out.println("3 or  more:  " + threeOrMore);
    System.out.println("lower(3): " + ns.lower(3));
    System.out.println("floor(3): " + ns.floor(3));
    System.out.println("higher(3): " + ns.higher(3));
    System.out.println("ceiling(3): " + ns.ceiling(3));

    System.out.println("pollFirst(): " + ns.pollFirst());
    System.out.println("Navigable Set:  " + ns);

    System.out.println("pollLast(): " + ns.pollLast());
    System.out.println("Navigable Set:  " + ns);

    System.out.println("pollFirst(): " + ns.pollFirst());
    System.out.println("Navigable Set:  " + ns);

    System.out.println("pollFirst(): " + ns.pollFirst());
    System.out.println("Navigable Set:  " + ns);

    System.out.println("pollFirst(): " + ns.pollFirst());
    System.out.println("Navigable Set:  " + ns);

    System.out.println("pollFirst(): " + ns.pollFirst());
    System.out.println("pollLast(): " + ns.pollLast());
  }
}

上面的代码生成以下结果。

Java集合教程 - Java列表

列表是对象的有序集合,在 List 界面中定义。 List  接口表示集合框架中的列表。

列表可以具有重复的元素。并且我们可以在列表中存储多个空值。

List 接口继承了集合接口和它添加了一些方法来支持使用索引访问其元素。

我们可以在 List 或的末尾添加一个元素在由整数索引标识的任何位置。

列表中元素的索引是从零开始的。

我们可以使用以下方法使用索引添加,获取,删除和替换其元素。

its add(int index, E  element), 
addAll(int  index, Collection<? extends E> c), 
get(int index), 
remove(int index) 
set(int  index, E  element) 

我们可以搜索元素的位置 List 使用indexOf(Object o)或 lastIndexOf(Object o)方法。

indexOf()方法搜索指定的对象从开始,它返回索引的对象的第一次出现。

lastIndexOf()方法从列表的末尾搜索元素。两个方法都返回-1如果 List 不包含指定的对象。

subList(int fromIndex,int toIndex)返回一个子列表的原始列表从索引fromIndex(包括)到索引toIndex(独占)。

ListIterator  List 接口可以返回在向前和向后方向上遍历其元素。

ArrayList和LinkedList

以下是实现 List 接口的两个类:

  • ArrayList
  • LinkedList

ArrayList由数组备份。链接列表由链接列表备份。

如果我们频繁地访问列表的元素,那么 ArrayList 会表现得更好。访问ArrayList中的元素更快,因为它是数组后端。

 ArrayList 添加或删除元素更慢除非从头到尾,因为 ArrayList 必须执行数组副本内部保持元素的顺序。

LinkedList 的性能优于 ArrayList 用于添加和从列表中间删除元素。但是,访问列表中的元素更慢,除非在列表的头部。

import java.util.ArrayList;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("Java");
    list.add("Oracle");
    list.add("CSS");
    list.add("XML");

    System.out.println("List: " + list);

    int count = list.size();
    System.out.println("Size of  List: " + count);

    // Print each element with its index
    for (int i = 0; i < count; i++) {
      String element = list.get(i);
      System.out.println("Index=" + i + ", Element=" + element);
    }

    List<String> subList = list.subList(1, 3);
    System.out.println(subList);

    // Remove "CSS" from the list 
    list.remove("CSS"); // Same as list.remove(2);
     System.out.println(list);
  }
}

上面的代码生成以下结果。

ListIterator

我们可以使用 ListIterator 接口以遍历列表。

ListIterator 接口继承了 Iterator 接口并且它增加了几个方法来从当前位置向后访问列表中的元素。

以下代码显示了如何从列表中获取列表迭代器:

ListIterator<String> fullIterator = list.listIterator();

为了得到在正向从索引5开始的列表迭代器,使用以下代码。

ListIterator<String> partialIterator = list.listIterator(5);

以下代码显示如何使用 ListIterator 

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Main {
  public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("Oracle");
    list.add("SQL");
    list.add("CSS");
    list.add("XML");
    System.out.println("List: " + list);
    // Get the list iterator
    ListIterator<String> iterator = list.listIterator();
    while (iterator.hasNext()) {
      int index = iterator.nextIndex();
      String element = iterator.next();
      System.out.println("Index=" + index + ", Element=" + element);
    }
    // Reuse the iterator to iterate from the end to the beginning
    while (iterator.hasPrevious()) {
      int index = iterator.previousIndex();
      String element = iterator.previous();
      System.out.println("Index=" + index + ",  Element=" + element);
    }
  }
}

上面的代码生成以下结果。

ListIterator 可以向前看或回头一个列表。

next()方法向前移动一个索引,而 previous()方法向后移动一个索引。

如果使用 next()方法,后跟 previous()方法,迭代器返回到相同的位置。

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值