guava中集合(4)

217 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

3.4、Table

3.2.1、本质

类似数据库的表,Map<R,Map<C,V>>,它有两个支持所有类型的键:”行”和”列”

3.2.2、常用实现

  • HashBasedTable:本质上用HashMap<R, HashMap<C, V>>实现;
  • TreeBasedTable:本质上用TreeMap<R, TreeMap<C,V>>实现;
  • ImmutableTable:本质上用ImmutableMap<R, ImmutableMap<C, V>>实现
  • ArrayTable:要求在构造时就指定行和列的大小,本质上由一个二维数组实现,以提升访问速度和密集Table的内存利用率

3.2.3、常用方法

image.png

3.2.4、代码示例

Table<String, String, Integer> table = HashBasedTable.create();
table.put("张三","语文",80);
table.put("张三","数学",83);
table.put("张三","英语",89);

Table<String, String, Integer> table2 = HashBasedTable.create();
table2.put("李四","语文",89);
table2.put("李四","数学",83);
table2.put("李四","英语",89);
table.putAll(table2);
// {张三={语文=80, 数学=83, 英语=89}, 李四={语文=89, 数学=83, 英语=89}}
System.out.println(table);
/**
 * 1、基于行的操作
 */
// 返回 用Map<R, Map<C, V>> 表现Table<R, C, V>
System.out.println(table.rowMap());
// 返回全部 rowKeySet [张三, 李四]
System.out.println(table.rowKeySet());
// 获取一行 {语文=89, 数学=83, 英语=89}
System.out.println(table.row("李四"));
System.out.println(table.row("李四").get("语文"));
/**
 * 2、基于列的操作
 */
// 返回 {语文={张三=80, 李四=89}, 数学={张三=83, 李四=83}, 英语={张三=89, 李四=89}}
System.out.println(table.columnMap());
// [语文, 数学, 英语]
System.out.println(table.columnKeySet());
// {张三=83, 李四=83}
System.out.println(table.column("数学"));

3.5、Range

3.2.1、本质

Range从名字就可以看出,这个是和区间有关的数据结构。可以方便方便的来表示一个开闭区间 image.png

3.2.2、常用实现

都是是一个具体实现,并没抽象顶级接口。

  • Range
  • RangeMap、TreeRangeMap

3.2.3、常见方法

3.2.3、代码示例

Range<Integer> closedRange = Range.closed(0, 9);
// [0..9]
System.out.println(closedRange);
// 是否包含5
System.out.println(closedRange.contains(5));
// 等同于 contains
System.out.println(closedRange.test(4));
// 最小值
System.out.println(closedRange.lowerEndpoint());
// 最大值
System.out.println(closedRange.upperEndpoint());

RangeMap<Integer, String> gradeScale = TreeRangeMap.create();
gradeScale.put(Range.closed(0, 60), "E");
gradeScale.put(Range.closed(61, 70), "D");
gradeScale.put(Range.closed(71, 80), "C");
gradeScale.put(Range.closed(81, 90), "B");
gradeScale.put(Range.closed(91, 100), "A");
// C
System.out.println(gradeScale.get(77));