我正在使用一个类,我将输入作为文件名和文件位置。我有一个预定义的文件名,所以我将预定义的文件名与我收到的文件名匹配,然后相应地存储值。请看下面的代码
//Set of storage maps and tables
public class storage
{
//Storage set
public static Set<Integer> tiger = new HashSet<Integer>();
//Storage set
public static Set<Integer> lion = new HashSet<Integer>();
//This is the table used for storing the browser customer count
public static Table<String,String,Integer> elephant = HashBasedTable.create();
//Storage map
public static Map<String, String> monkey = new HashMap<String, String>();
public static void storeDataDirector(String fileLocation,String fileName) throws Exception
{
if (fileName = monkey)
**update the "monkey map"**
}
这是我的问题,我也有很多地图和表格要使用,所以我不能使用多个if条件,然后检查并更新它。
我想知道的是以下
正如我之前所说,我发送给程序的文件名是“String filename”,其名称与“Map monkey”相同,但前者是String,后者是地图。 我想知道我是否能够使用字符串变量作为地图实例的引用,因为它们都具有相同的名称。这将极大地避免我在程序中使用的if条件,因此我想为此解决这个问题...任何与类型case ort相关的内容
答案 0 :(得分:2)
您需要另一个Map
- 其密钥为String
,值为Map
。像Map<String,Map> allMaps = new HashMap<String,Map>()
获得此地图后,请使用所有文件名和相应的地图monkey
填充该地图。
allMaps .put("monkey", monkey)
如果字符串文件名不是map
而是set
,那么您需要声明更通用的Map<String,Object> allMaps = new HashMap<String,Object>()
。当然,这意味着您需要先将值转换为其特定类型,然后再对其执行任何有意义的操作。
然后,要使用此地图,请使用您的文件名参数
Map monkeyAgain = allMaps.get(filename)
答案 1 :(得分:1)
您可以使用反射:
Storage.class.getField(fileName).get(null)
您仍然需要强制转换返回的对象。我不认为这是正确的方法。
答案 2 :(得分:0)
我们的想法是将它们与Map相关联,并使用文件名作为键,例如
Map<String, Map<String, String>>
// file store structure
如果您需要通用解决方案,可以通过实现类似于此的接口来实现商店结构的抽象来解决此问题:
// T is the store type and U is the original type (String from file for instance...)
public interface StoreUnit<T, U> {
void update(U record);
List<T> list();
}
因此,您将为每种情况(Set,Map,Table ...)实现一个实现,并将使用文件名作为键将其与地图相关联。
monkeyFileName => MapStoreUnit<Entry<String,String>,String>
tigerFileName => SetStoreUnit<Integer, String>
elephantFileName => TableStoreUnit<Entry<Entry<String,String>,String>,String> // not sure if for Table there is something better than Entry ;)
当您想要更新某个商店时,您使用文件名作为键在地图上执行get
,并调用使用该记录实现的update
方法(可能是String
,复杂Object
)等等。当您需要从那里阅读某些内容时,您可以使用list
方法。