繁体   English   中英

将 3 个不同的值从数据库放入 Hashmaps

[英]put 3 different values from database to Hashmaps

在我的数据库中,我有 3 列: Date(PrimaryKey, TEXT)FlightNumber(PrimaryKey, INTEGER)LoadEstimate(INTEGER) 我想做的是将数据库中的所有值放入 hashmap。 我必须确保所有数据类型都正确才能将它们加载到其中,并且希望通过用户输入(日期和航班号)过滤LoadEstimate数据,然后返回LoadEstimate的预测数字,如果没有返回-1 .

这是我的数据库:

在此处输入图像描述

文本

将您的日期和航班号组合成一个字符串。 也许在它们之间包含一个分隔符,以便于人类阅读和机器解析。

该组合文本是 map 的关键。 integer 的负载因子数是您对 map 的值。

Map< String , Integer > map = new HashMap<>() ; 

使用JDBC访问数据库。 循环传入的数据库数据。 对于每个数据库行,将这两个字段组合起来,并使用第三个字段输入 map。

String k = localDate.toString() + "F" + flightNumber ;
Integer v = loadFactor ;
map.put( k , v ) ;

取回。 如果 map 未找到值, getOrDefault方法将返回默认值。 你说你想要一个 -1 作为默认值。

Integer loadFactor = map.getOrDefault( k , Integer.valueOf( -1 ) ;

Object

或者,您可以创建一个 class 来保存日期和航班号。

Java 16 中的新记录功能非常适合此功能。 编译器隐式创建构造函数、getter、 equals & hashCodetoString 请注意,您可以在使用它的代码块中本地定义您的记录。

对于较旧的 Java,写入常规的 class 而不是记录。

record DateFlight ( LocalDate localDate , Integer flightNumber ) {}

将您的 map 定义为:

Map< DateFlight , Integer > map = new HashMap<>() ; 

并调用put

DateFlight k = new DateFlight( localDate , flightNumber ) ;
Integer v = loadFactor ;
map.put( k , v ) ;

选择Map

您有多种Map实现可供选择,与 Java 捆绑在一起。 第三方也提供实现。

我可能会从HashMap开始加载数据。 然后使用Map.copyOf在 ZD52387880E2138177A 和更高版本中使用 Map.copyOf 制作未指定 class 的不可修改的 map。

Map< DateFlight , Integer > dataLoad = new HashMap<>() ; 
… load data
Map< DateFlight , Integer > map = Map.copyOf( dataLoad ) ; // Make unmodifiable `Map`. 

这是我制作的一张图表,作为捆绑地图的指南。

在此处输入图像描述

不会强迫您创建一种新的 Object 来存储行信息的最简单的解决方案是:

Hashmap 包含键值对并将每个唯一键映射到一个值。

根据 SQL 数据库信息,您提供的表具有复合主键,换句话说,您的主键由两列(TEXT 类型的日期和 INTEGER 类型的航班号)组成。

如您所知,主键具有唯一值,以帮助您在查询表中的数据时进行区分。 因此,您应该在 hashmap 中存储表的主键作为键。

现在,由于您的主键由两列组成,并且它们的值的组合可以帮助您识别唯一性,因此您可以创建一个数组或列表并将日期和 * flightNumber * 存储在那里。 然后,您将将此数组/列表作为键添加到 hashmap 中,并将所需字段的 rest(在我们的示例中为 INTEGER 类型的 loadEstimate)作为其值。

上面的代码应该是这样的:

HashMap<ArrayList<Object>, int> myMap = new HashMap<>(); //Create your hashmap

while (rs.next()) {
    LocalDate  date = LocalDate.parse(rs.getString("Date"));
    int  flightnumber = Integer.parseInt(rs.getString("FlightNumber"));
    int loadestimate = Integer.parseInt(rs.getString("LoadEstimate"));

    //Create array resembling the primary key
    ArrayList<Object> mapKey = new ArrayList<>();
    mapKey.add(date);
    mapKey.add(new Integer(flightnumber));

   //Store to Map the key and the value
   myMap.put(mapKey, loadestimate);
}
//then do sth with the hashmap

请注意,我创建了一个类型为 Object 的通用对象数组,以便能够存储不同类型的对象。 这是可能的,因为它们都是 class Object 的子类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM