我想_RARE_
使用 JAVA 在JSON树中替换稀有词。
我的罕见单词列表包含
late
populate
convicts
所以对于下面的JSON
["S", ["PP", ["ADP", "In"], ["NP", ["DET", "the"], ["NP", ["ADJ", "late"], ["NOUN", "1700<s"]]]], ["S", ["NP", ["ADJ", "British"], ["NOUN", "convicts"]], ["S", ["VP", ["VERB", "were"], ["VP", ["VERB", "used"], ["S+VP", ["PRT", "to"], ["VP", ["VERB", "populate"], ["WHNP", ["DET", "which"], ["NOUN", "colony"]]]]]], [".", "?"]]]]
我应该得到
["S", ["PP", ["ADP", "In"], ["NP", ["DET", "the"], ["NP", ["ADJ", "_RARE_"], ["NOUN", "1700<s"]]]], ["S", ["NP", ["ADJ", "British"], ["NOUN", "_RARE_"]], ["S", ["VP", ["VERB", "were"], ["VP", ["VERB", "used"], ["S+VP", ["PRT", "to"], ["VP", ["VERB", "populate"], ["WHNP", ["DET", "which"], ["NOUN", "colony"]]]]]], [".", "?"]]]]
注意如何
["ADJ","late"]
被替换为
["ADJ","_RARE_"]
到目前为止,我的代码如下:
我递归地遍历树,一旦发现稀有单词,我就创建一个新的JSON数组,并尝试用它替换现有树的节点。看到// this Doesn't work
下面,这就是我被卡住的地方。在此功能之外,树保持不变。
public static void traverseTreeAndReplaceWithRare(JsonArray tree){
//System.out.println(tree.getAsJsonArray());
for (int x = 0; x < tree.getAsJsonArray().size(); x++)
{
if(!tree.get(x).isJsonArray())
{
if(tree.size()==2)
{
//beware it will get here twice for same word
String word= tree.get(1).toString();
word=word.replaceAll("\"", ""); // removing double quotes
if(rareWords.contains(word))
{
JsonParser parser = new JsonParser();
//This works perfectly
System.out.println("Orig:"+tree);
JsonElement jsonElement = parser.parse("["+tree.get(0)+","+"_RARE_"+"]");
JsonArray newRareArray = jsonElement.getAsJsonArray();
//This works perfectly
System.out.println("New:"+newRareArray);
tree=newRareArray; // this Doesn't work
}
}
continue;
}
traverseTreeAndReplaceWithRare(tree.get(x).getAsJsonArray());
}
}
上面调用的代码,我用的是谷歌的gson
JsonParser parser = new JsonParser();
JsonElement jsonElement = parser.parse(strJSON);
JsonArray tree = jsonElement.getAsJsonArray();
这是C ++中的直接方法:
#include <fstream>
#include "JSON.hpp"
#include <boost/algorithm/string/regex.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/phoenix.hpp>
static std::vector<std::wstring> readRareWordList()
{
std::vector<std::wstring> result;
std::wifstream ifs("testcases/rarewords.txt");
std::wstring line;
while (std::getline(ifs, line))
result.push_back(std::move(line));
return result;
}
struct RareWords : boost::static_visitor<> {
/////////////////////////////////////
// do nothing by default
template <typename T> void operator()(T&&) const { /* leave all other things unchanged */ }
/////////////////////////////////////
// recurse arrays and objects
void operator()(JSON::Object& obj) const {
for(auto& v : obj.values) {
//RareWords::operator()(v.first); /* to replace in field names (?!) */
boost::apply_visitor(*this, v.second);
}
}
void operator()(JSON::Array& arr) const {
int i = 0;
for(auto& v : arr.values) {
if (i++) // skip the first element in all arrays
boost::apply_visitor(*this, v);
}
}
/////////////////////////////////////
// do replacements on strings
void operator()(JSON::String& s) const {
using namespace boost;
const static std::vector<std::wstring> rareWords = readRareWordList();
const static std::wstring replacement = L"__RARE__";
for (auto&& word : rareWords)
if (word == s.value)
s.value = replacement;
}
};
int main()
{
auto document = JSON::readFrom(std::ifstream("testcases/test3.json"));
boost::apply_visitor(RareWords(), document);
std::cout << document;
}
假设您要替换所有字符串值,并且仅匹配整个字符串。
略微适应了评论。
您可以通过更改regex或regex标志轻松地使这种大小写不敏感,匹配字符串中的单词等。
包括JSON.hpp /
cpp的完整代码在这里:https :
//github.com/sehe/spirit-v2-json/tree/16093940
假设我在一棵树中有一个节点,我如何获得所有的叶节点,它们的祖先是这个节点?我这样定义了TreeNode:
我有基于csv数据源的jrxml文件。csv文件中只有一列包含json字符串。 考虑以下示例: 请注意,CaseID始终存在,但不能保证TAG_AND_VALUES的顺序,因为可以动态添加或增长TAG_AND_VALUE。 我想从每个TAG_AND_VALUES中读取每个caseID的值。
我试图搜索给定红黑树中所有根到叶的路径。特别是,我想编写一个测试,在给定rbt的情况下,该测试将断言每个路径具有相同数量的黑色节点。 我用两个全局变量尝试这样的东西: 然而,当左分支中的黑色节点右侧有红色节点时,我遇到了麻烦,因为这意味着计数比应该减少的更多。 有没有更好的方法来搜索根到叶的路径,计算特定值的频率,然后以某种方式比较计数?或者,如果给定rbt余额,是否有一种完全不同的方法来测试rb
在我们看实现之前,先来看看 map ADT 提供的接口。你会注意到,这个接口与Python 字典非常相似。 Map() 创建一个新的空 map。 put(key,val) 向 map 中添加一个新的键值对。如果键已经在 map 中,那么用新值替换旧值。 get(key) 给定一个键,返回存储在 map 中的值,否则为 None。 del 使用 del map[key] 形式的语句从 map 中删除
问题内容: 我知道这不是第一次问这个问题,但是回答并没有给我带来太大帮助,所以我正在帮助我最终将得到我的答案 我做了这个小游戏,我在轨道上开车(必须使用矩形)。当我使用方法时,代表汽车的矩形在新位置重新粉刷,但后面留下了痕迹。 我有这个代码: 问题答案: 在绘制方法中取消注释super.paint(g)[第87行]。 它负责清除画布上的任何陈旧对象。
编码和解码简单数据类型 # json_simple_types.py import json data = [{'a': 'A', 'b': (2, 4), 'c': 3.0}] print('DATA:', repr(data)) data_string = json.dumps(data) print('JSON:', data_string) # json_simple_types_d