これは思考の流れに関する質問なので、これに対処するためにサードパーティのライブラリを使用させないでください。
最近、就職の面接を受けましたが、以下のような質問があります。
データベースのような構造の巨大な JSON ファイルがあります。
{
"tableName1 ":[
{"t1field1":"value1"},
{"t1field2":"value2"},
...
{"t1fieldN":"valueN"}
],
"tableName2 ":[
{"t2field1":"value1"},
{"t2field2":"value2"},
....
{"t2fieldN":"valueN"}
],
.......
.......
"tableNameN ":[
{"tNfield1":"value1"},
{"tNfield2":"value2"},
....
{"tNfieldN":"valueN"}
]
}
要件は次のとおりです。
- 指定された子ノードの名前でいくつかの特別な子ノードを見つけ、そのフィールドの値を更新してから、新しい JSON ファイルに保存します。
- 指定されたフィールドの名前と値の数を数えます。
通常のサイズの JSON ファイルの場合、JSON ファイルをローカルからロードして JSON オブジェクトに解析するユーティリティ クラスを作成しました。次に、2 つの要件に対処するための 2 つのメソッドを作成しました。
void upDateAndSaveJson(JSONObject json, String nodeName,
Map<String, Object> map, Map<String, Object> updateMap,
String outPath) {
//map saved target child-node's conditions
//updateMap saved update conditions
// first find the target child-node and update it finally save it
// ...code ...
}
int getCount(JSONObject json, Map<String, Object> map) {
//map saved field target field/value
// ...code...
}
しかし、インタビュアーは、JSON ファイルが非常に巨大な場合の状況について考えさせてくれました。それから、コードを修正して、より効果的にする方法を教えてくれました。
私の考えは、最初に JSON ファイルを分割するツールを作成することです。最後に、前の 2 つのメソッドを呼び出すために JSON オブジェクトを取得する必要があるため、巨大な JSON ファイルを分割する前に、2 つのメソッドのパラメーターを知っています。 (子ノード名)
そのため、JSON ファイルをロードすると、入力ストリーム文字列とターゲット nodeName を比較し、子ノードのオブジェクトの数をカウントし始めます。ルールが 100 の場合、100 個のオブジェクトがある場合、子ノードを分割します。新しい小さな JSON ファイルを作成し、ソース JSON ファイルでそれを削除します。
以下のように:
while((line = reader.readLine()) != null){
for (String nodeName : nodeNames) {
//check if its' the target node
if (line.indexOf(nodeName) != -1) {
//count the target child-node's object
//and then split to smaller JSON file
}
}
}
その後、複数のスレッドを使用して、前に作成した小さな JSON ファイルをロードし、2 つのメソッドを呼び出して JSON オブジェクトを処理できます。
これは思考の流れに関する質問なので、この問題に対処するためにサードパーティのライブラリを使用できるとは言わないでください。
それで、もし私が実現可能なら?または、皆さんが持っている他のアイデアがあれば、共有してください。
ありがとう。