【发布时间】:2019-04-29 06:37:17
【问题描述】:
我正在尝试将我们讲师提供的 python 代码转换为等效的 Java 代码。这部分代码应该从 txt 文件中读取,用正则表达式解析数据,并将它们存储为单词数组。本练习的一个限制是“data_storage_obj”用于模拟 JavaScript 对象,我们必须将它们保持为该键值格式。
该指令表示Java中最接近JavaScript Object的数据结构是“HashMap”。但是,因为每个键都映射到不同的数据结构来存储相应的信息,所以目前我能想到的最好的类型是“对象”。但是,其中一个键映射到 lambda 函数,所以我收到这条错误消息,上面写着“错误:不兼容的类型:对象不是功能接口”。我想知道我应该使用什么类型来涵盖我要存储为地图值的所有类型。
导师提供的一段代码:
def extract_words(obj, path_to_file):
with open(path_to_file) as f:
obj['data'] = f.read()
pattern = re.compile('[\W_]+')
data_str = ''.join(pattern.sub(' ', obj['data']).lower())
obj['data'] = data_str.split()
data_storage_obj = {
'data' : [],
'init' : lambda path_to_file : extract_words(data_storage_obj, path_to_file),
'words' : lambda : data_storage_obj['data']
}
data_storage_obj['init'](sys.argv[1])
我一直在处理的 Java 代码:
public class Twelve{
static void extract_words(Object obj, String path_to_file){
System.out.println("extract_words()");
if(obj instanceof HashMap){
HashMap<String, Object> hashMap = (HashMap<String, Object>) obj;
String file_data = "";
try {
file_data = (new String(Files.readAllBytes(Paths.get(path_to_file)))).replaceAll("[\\W_]+", " ").toLowerCase();
} catch (IOException e) {
e.printStackTrace();
}
hashMap.put("data", Arrays.asList(file_data.split(" ")));
obj = hashMap;
}
}
static HashMap<String, Object> data_storage_obj = new HashMap<>();
public static void main(String[] args){
ArrayList<String> data = new ArrayList<String>();
data_storage_obj.put("data", data);
data_storage_obj.put("init", path_to_file -> extract_words(data_storage_obj, path_to_file));
data_storage_obj.put("words", data_storage_obj.get("data"));
}
}
【问题讨论】:
-
请注意,您没有正确翻译您的 python 代码。 python 代码 mutates 第一个参数,它不 assign 给它。您正在尝试对您的参数进行分配。至于您的错误,您只需将 lambda 转换为适当的类型 - 您在编写 main 函数时将使用的类型。
-
@realSkeptic 这个骗子真的回答了这个问题吗?
-
@Jonas 它回答了主要部分,这就是 OP 收到他们提到的错误的原因。当然,正如我已经提到的,翻译还有其他问题,但是一旦对 lambdas 使用了正确的转换,他们就可以调试它的其余部分。
-
@realSkeptic "正确的转换" ...您真的建议在调用时将 Runnable 转换为 Object ,然后将 Object 转换回 Runnable 吗?我也看不到重复的地址。
-
@JonasWilms 鉴于练习的限制,这似乎是唯一的选择。这不是我在任何现实生活项目中都会做的事情,但家庭作业问题不是现实生活项目。
标签: java python lambda hashmap