0

Javaでコマンドラインから読み込もうとしています。

コマンドラインからこれらのパラメータを渡していると仮定します-

TABLE1 TABLE2 TABLE3

次に、コマンドプロンプトから読み取った後、tableNamesリストには上記の3つのテーブル名がすべて含まれます。

private static List<String> tableNames= new ArrayList<String>();

次に、これをループして、プロパティファイルから対応する値をロードすることにより、tableNamesすべてをに入れる必要があります。ConcurrentHashMap

だから私はそれをこのようにやっています。

private static ConcurrentHashMap< String,
   ConcurrentHashMap< String, String >> tableList = new ConcurrentHashMap<>();
private static ConcurrentHashMap<String,
   String >                       databaseDetails = new ConcurrentHashMap<>();
prop.load(MainTest.class.getClassLoader().getResourceAsStream("config.properties"));
for (String arg : tableNames) {
   String url = (String) prop.get(arg + ".url");
   String user = (String) prop.get(arg + ".user");
   String password = (String) prop.get(arg + ".password");
   String driver = (String) prop.get(arg + ".driver");
   String suffix = (String) prop.get(arg + ".suffix");
   String sql = (String) prop.get(arg + ".sql");
   databaseDetails.put("URL",url);
   databaseDetails.put("USER",user);
   databaseDetails.put("PASSWORD",password);
   databaseDetails.put("DRIVER",driver);
   databaseDetails.put("SUFFIX",suffix);
   databaseDetails.put("SQL",sql);
   tableList.put(arg,databaseDetails);
}

これがマップのマップに値を配置する正しい方法であるかどうかわかりませんか?または、これを少し改善できますか?

4

2 に答える 2

1

主に行う必要があるのは、databaseDetails マップの作成を for ループ内に移動することです。現時点では、ループを通過するたびに、前の反復で抽出した詳細を上書きしています。ループするたびに、databaseDetails の新しいセットを収集しているため、それらを配置するための新しい databaseDetails マップが必要です。

于 2013-02-12T22:45:00.460 に答える
1

これにより、テーブル リストにマップが 1 つだけ表示されます。反復ごとに新しい databaseDetails マップを作成する必要があります。そのため、ループ内でローカル変数を使用する代わりに、databaseDetails メンバー変数を削除してください。

于 2013-02-12T22:45:18.320 に答える