Guava类库学习--Table(双键的Map)

本文介绍了Guava库中的Table接口,它是一个双键映射数据结构,类似于二维表格。文章列举了主要操作方法,如cellSet、rowKeySet、columnKeySet、values、rowMap和columnMap等,并通过学生-课程-成绩的例子进行示例演示。通过这些方法,可以方便地查询和展示数据,例如按学生查看成绩和按课程查看成绩。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Table是Guava提供的一个接口 Interface Table<R,C,V>,由rowKey+columnKey+value组成
它有两个键,一个值,和一个n行三列的数据表类似,n行取决于Table对对象中存储了多少个数据

主要使用的方法有:
* 所有行数据:cellSet()
* 所有第一个key值:rowKeySet()
* 所有课程:columnKeySet()
* 所有成绩:values()
* 课程成绩表:rowMap()+get(stu)/row(stu)
* 学生成绩表 columnMap()+get(course)/column(course)

给出一个学生-课程-成绩表,测试上面提到的方法,表如下
这里写图片描述

1.把数据存储到Table中,通过HashBasedTable.create()新建一个Table对象

Table<String,String,Integer> tables=HashBasedTable.create();
    tables.put("a", "javase", 80);
    tables.put("b", "javaee", 90);
    tables.put("c", "javame", 100);
    tables.put("d", "guava", 70);

2.得到所有行数据 tables.cellSet()

Set<Cell<String,String,Integer>> cells=tables.cellSet();
for(Cell<String,String,Integer> temp:cells){
    System.out.println(temp.getRowKey()+" "+temp.getColumnKey()+" "+temp.getValue());
}
输出结果:
d guava 70
b javaee 90
c javame 100
a javase 80

3.得到所有学生 rowKeySet()

Set<String> students=tables.rowKeySet();
for(String str:students){
    System.out.print(str+"\t");
}
输出结果:
d   b   c   a

4.得到所有课程 columnKeySet()

Set<String> courses=tables.columnKeySet();
for(String str:courses){
    System.out.print(str+"\t");
}
输出结果:
guava   javaee  javame  javase

5.得到所有成绩:values

Collection<Integer> scores=tables.values();
for(Integer in:scores){
    System.out.print(in+"\t");
}
输出结果:
70  90  100 80      

6.得到学生的课程成绩表 rowMap+get(stu)/row(stu)

for(String str:students){
    Map<String,Integer> rowMap=tables.row(str);
    Set<Entry<String,Integer>> setEntry=rowMap.entrySet();
    for(Entry<String,Integer> entry:setEntry){
        System.out.println(entry.getKey()+" "+entry.getValue());
    }
}
输出结果:
guava 70
javaee 90
javame 100
javase 80

7.得到学生的姓名成绩表 columnMap+get(course)/column(course)

for (String str : courses) {
    Map<String, Integer> rowMap2 = tables.column(str);
    Set<Entry<String, Integer>> setEntry2 = rowMap2.entrySet();
    for (Entry<String, Integer> entry : setEntry2) {
        System.out.println(entry.getKey() + " " + entry.getValue());
    }
}
输出结果为:
d 70
b 90
c 100
a 80

————————————分割线————————————–

了解这些方法后,基于上表,实现一个花样查询表中数据的demo

import java.util.Map;
import java.util.Set;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.google.common.collect.Table.Cell;
import com.google.common.collect.Tables;

/**
 * 双键的Map--〉table
 * rowKey+columnKey+value
 * 方法
 * 所有行数据:cellSet
 * 所有学生:rowKeySet
 * 所有课程:columnKeySet
 * 所有成绩:values
 * 学生对应课程:rowMap+get/row
 * 课程对应学生 columnMap+get/column
 * @author wwyDEPP
 *
 */
public class Demo08 {
    public static void main(String[] args) {
        //新建一个table对象,并存入数据
        Table<String,String,Integer> tables=HashBasedTable.create();
        tables.put("a", "javase", 80);
        tables.put("b", "javaee", 90);
        tables.put("c", "javame", 100);
        tables.put("d", "guava", 70);

        System.out.println("---------------------------按学生查看成绩---------------------------");

        System.out.print("学生\t");
        //得到所有课程
        Set<String> courses=tables.columnKeySet();
        for(String str:courses){
            System.out.print(str+"\t");
        }

        System.out.println();
        //得到所有学生
        Set<String> stus=tables.rowKeySet();
        for(String str:stus){
            System.out.print(str+"\t");
            //课程成绩表
            Map<String,Integer> scores=tables.row(str);
            for(String c:courses){
                //输出成绩
                System.out.print(scores.get(c)+"\t");
            }
            System.out.println();
        }

        System.out.println("---------------------------按课程查看成绩---------------------------");

        System.out.print("课程\t");
        //得到所有学生
        Set<String> stus2=tables.rowKeySet();
        for(String str:stus2){
            System.out.print(str+"\t");
        }
        System.out.println();

        //得到所有课程
        Set<String> courses2=tables.columnKeySet();
        for(String str:courses2){
            System.out.print(str+"\t");
            //得到学生成绩表
            Map<String,Integer> map=tables.column(str);
            for(String stu:stus2){
                //输出成绩
                System.out.print(map.get(stu)+"\t");
            }
            System.out.println();
        }

        System.out.println("---------------------------转换---------------------------");
        //将列调换,由学生-课程-成绩表变为 课程-学生-成绩
        Table<String,String,Integer> tables2=Tables.transpose(tables);
        // 得到所有行数据
        Set<Cell<String, String, Integer>> cells2 = tables2.cellSet();
        for (Cell<String, String, Integer> temp : cells2) {
            System.out.println(temp.getRowKey() + " " + temp.getColumnKey()+ " " + temp.getValue());
        }   
    }
}

输出结果为:
—————————-按学生查看成绩—————————
学生 guava javaee javame javase
d 70 null null null
b null 90 null null
c null null 100 null
a null null null 80
—————————按课程查看成绩—————————
课程 d b c a
guava 70 null null null
javaee null 90 null null
javame null null 100 null
javase null null null 80
———————————转换———————————
guava d 70
javaee b 90
javame c 100
javase a 80

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值