public static Map m = new HashMap() { { m.put("a","2"); } }; 为什么不能初始化
时间: 2024-05-13 14:13:27 浏览: 19
这段代码不能正常初始化的原因是语法错误。应该将初始化代码放在静态代码块中,如下所示:
```
public static Map m = new HashMap();
static {
m.put("a", "2");
}
```
静态代码块在类加载时执行,可以用来进行一些初始化操作。在这个例子中,我们将初始化代码放在了静态代码块中,可以成功初始化 Map 对象。
相关问题
public static final Map<String, String> bathScheme = new HashMap<>(); 初始化写法
初始化写法有很多种,以下是几种常见的方法:
1. 使用静态代码块进行初始化:
```
public static final Map<String, String> bathScheme;
static {
bathScheme = new HashMap<>();
bathScheme.put("key1", "value1");
bathScheme.put("key2", "value2");
// 以此类推
}
```
2. 使用Collections.unmodifiableMap()方法进行初始化:
```
public static final Map<String, String> bathScheme = Collections.unmodifiableMap(new HashMap<String, String>() {{
put("key1", "value1");
put("key2", "value2");
// 以此类推
}});
```
3. 使用Map.of()方法进行初始化(需要Java 9及以上版本):
```
public static final Map<String, String> bathScheme = Map.of("key1", "value1", "key2", "value2");
```
完善代码:public class LLParserExample { // 预测分析表 private Map<String, Map<String, String>> parseTable; private String startSymbolMap; private String []terminalSymbol; public LLParserExample(String startSymbolMap, String []terminalSymbol, Map<String, Map<String, String>> parseTable) { this.parseTable = parseTable; this.startSymbolMap = startSymbolMap; this.terminalSymbol = terminalSymbol; } public boolean parse(String input) { return false; } // 判断符号是否是终结符 private boolean isTerminal(String symbol) { for (int i=0; i<this.terminalSymbol.length ; i++) { if(this.terminalSymbol[i].equals(symbol)) return true; } return false; } public static void main(String[] args) { //文法终结符号集合 String []tSymbols = {"a","b"}; // 初始化预测分析表 Map<String, Map<String, String>> parseTable; parseTable = new HashMap<>(); Map<String, String> row1 = new HashMap<>(); row1.put("a", "A->aB"); row1.put("b", "A->b"); parseTable.put("A", row1); Map<String, String> row2 = new HashMap<>(); row2.put("a", "B->a"); row2.put("b", "B->bA"); parseTable.put("B", row2); //初始化LL(1)分析器 LLParserExample parser = new LLParserExample("A", tSymbols, parseTable); //分析input是否为文法的一个句子并输出产生式序列 String input = "abaa"; boolean success = parser.parse(input); if (success) { System.out.println("分析成功"); } else { System.out.println("分析失败"); } } }
public class LLParserExample {
// 预测分析表
private Map<String, Map<String, String>> parseTable;
private String startSymbolMap;
private String[] terminalSymbol;
public LLParserExample(String startSymbolMap, String[] terminalSymbol, Map<String, Map<String, String>> parseTable) {
this.parseTable = parseTable;
this.startSymbolMap = startSymbolMap;
this.terminalSymbol = terminalSymbol;
}
public boolean parse(String input) {
Stack<String> stack = new Stack<>();
stack.push("$"); // 将结束符号入栈
stack.push(this.startSymbolMap); // 将文法的开始符号入栈
int index = 0; // 输入串的指针
while (!stack.isEmpty()) {
String top = stack.pop(); // 栈顶元素出栈
if (this.isTerminal(top)) { // 如果栈顶为终结符
if (top.equals("$")) { // 如果栈顶为结束符号
return input.charAt(index) == '$'; // 如果输入串也为结束符号,则分析成功
}
if (top.equals(String.valueOf(input.charAt(index)))) { // 如果栈顶与输入串指针所指字符相同
index++; // 输入串指针后移
} else {
return false; // 分析失败
}
} else { // 如果栈顶为非终结符
Map<String, String> row = this.parseTable.get(top); // 获取预测分析表中该非终结符对应的一行
String production = row.get(String.valueOf(input.charAt(index))); // 获取该行中与输入串指针所指字符相对应的产生式
if (production == null) { // 如果找不到对应的产生式
return false; // 分析失败
}
String[] symbols = production.split("->")[1].split(""); // 获取产生式右部的符号序列
for (int i = symbols.length - 1; i >= 0; i--) { // 将产生式右部的符号序列逆序入栈
stack.push(symbols[i]);
}
}
}
return false; // 分析失败
}
// 判断符号是否是终结符
private boolean isTerminal(String symbol) {
for (int i = 0; i < this.terminalSymbol.length; i++) {
if (this.terminalSymbol[i].equals(symbol))
return true;
}
return false;
}
public static void main(String[] args) {
// 文法终结符号集合
String[] tSymbols = {"a", "b"};
// 初始化预测分析表
Map<String, Map<String, String>> parseTable;
parseTable = new HashMap<>();
Map<String, String> row1 = new HashMap<>();
row1.put("a", "A->aB");
row1.put("b", "A->b");
parseTable.put("A", row1);
Map<String, String> row2 = new HashMap<>();
row2.put("a", "B->a");
row2.put("b", "B->bA");
parseTable.put("B", row2);
// 初始化LL(1)分析器
LLParserExample parser = new LLParserExample("A", tSymbols, parseTable);
// 分析input是否为文法的一个句子并输出产生式序列
String input = "abaa";
boolean success = parser.parse(input);
if (success) {
System.out.println("分析成功");
} else {
System.out.println("分析失败");
}
}
}