将数据库中的3个不同值放入hashmaps

cedebl8k  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(261)

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

ovfsdjhp

ovfsdjhp1#

文本

将日期和航班号组合为一个字符串。可能在它们之间包含一个分隔符,以便于人类阅读和机器解析。
组合文本是你绘制Map的关键。负载因子的整数是Map的值。

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

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

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

检索。这个 getOrDefault 如果Map找不到值,则方法返回默认值。你说过你想要一个-1作为默认值。

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

对象

或者,您可以创建一个类来保存日期和航班号。
Java16中的新记录特性非常适合这种情况。编译器隐式地创建构造函数getters, equals & hashCode ,和 toString . 请注意,可以在使用记录的代码块中本地定义记录。
对于较旧的java,编写常规类而不是记录。

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 在Java9和更高版本中。

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

这是我做的一个图形,作为捆绑Map的指南。

qmelpv7a

qmelpv7a2#

最简单的解决方案不会强迫您创建一种新的对象来存储行的信息,它是:
hashmap包含键值对,并将每个唯一键Map到一个值。
根据您提供的sql数据库信息,您的表有一个复合主键,换句话说,您的主键由两列组成(日期为text类型,航班号为integer类型)。
如您所知,主键具有唯一的值,以便在查询表中的数据时帮助您进行区分。因此,应该将表的主键作为键存储在hashmap中。
现在,由于主键由两列组成,并且它们的值的组合有助于识别唯一性,因此可以创建一个数组或列表,并将日期和flightnumber存储在其中。然后,将此数组/列表作为键添加到hashmap中,并将所需的其余字段(在本例中是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类型的泛型对象数组,以便能够存储不同类型的对象。这是可能的,因为它们都是类对象的子类。

相关问题