大家好,我又要问一个很老套的数组分组问题。我想要做的是把 var a:int=10;
var b:int=10;
var c:int=10;
var d:Number=10;
var e:Number=10;
转化为:var a,b,c:int=10;
var d,e:Number=10;因此,我使用 array= new ArrayList();
array中的元素为,var a:int=10,var b:int=10,var c:int=10, var d:Number=10,var e:Number=10我现在想把ArrayList的元素进行分组,把冒号后面的字符相等的元素,分为一组,存入另一个ArrayList中,新的ArrayList含有2个元素:var a,b,c:int=10,var d,e:Number=10
谢谢!
解决方案 »
- 基于UPD的Socket编程的乱码问题
- 紧急求助:WebSphere MQ的事务管理问题,解决马上结贴
- log4j.xml部署后为什么没办法写logger呢?在debug模式下是可以的
- 有这样的函数吗?
- 关于使用Java与sqlserver2000数据库连接的问题
- java要考试了,谈点容易错的地方吧
- 请教
- 俺对流不太懂,请问如何把一个字符串输出成一个文本文件,谢谢。
- 有高手知道请速回答,万分火急!如何得到两整数之商(结果精确到两位小数)
- 一个简单问题,关于编码
- javac找不到文件(能够运行文件,但不能编译源文件)
- java 压缩 ,想将文件夹内的每个文件单独压缩并命名为原文件名.zip,怎么修改?请指教!
想问一下,var a:int=10;是什么语法?
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Arrays;/**
* 合并定义语句
*/
public class MergeDefinition { public static void main(String[] args) {
String str = "var a:int=10;\n" +
"var b:int=10;\n" +
"var c:int=10;\n" +
"var d:Number=10;\n" +
"var e:Number=10;";/*
// 你也可以试试这个
String str = "var a:int=10;\n" +
"var b:int=10;\n" +
"var c:int=20;\n" +
"var d:Number=10;\n" +
"var e:Number=10;";
*/ // 拆分
String[] definitions = str.split(";(\n)?"); // 创建解析器
DefAnalyzer analyzer = new DefAnalyzer(); // 将拆分的语句丢入解析器
for (String definition : definitions) {
analyzer.addDefinition(definition);
} // 合并
List<String> merged = analyzer.mergeDifinitions(); // 输出
System.out.println("合并前:\n" + str + "\n");
System.out.println("合并后:");
for (String s : merged) {
System.out.println(s);
}
}
}/**
* 解析器
*/
class DefAnalyzer { // 这里三个 String,第一个保存主要分组依据(数据类型),
// 第二个保存次要分组依据(初始化的值),最里面的 String 保存变量名。
// 一个数据类型可能对应多个值;一个值可能对应多个变量名。
private HashMap<String, HashMap<String, List<String>>> definitions =
new HashMap<String, HashMap<String, List<String>>>(); /**
* 添加一个定义语句
*
* @param def_str 定义语句
*/
public void addDefinition(String def_str) {
def_str = StringUtil.cut(def_str, "var"); String var_name = StringUtil.before(def_str, ":");
String var_type = StringUtil.between(def_str, ":", "=");
String var_value = StringUtil.after(def_str, "="); putDefinition(var_type, var_name, var_value);
} /**
* 将定义放入 definitions
*
* @param type 变量类型
* @param name 变量名
* @param value 变量值
*/
private void putDefinition(String type, String name, String value) {
// 根据类型和值找到变量名列表,将变量名加入列表中。
List<String> names = getNames(type, value);
names.add(name);
} // 根据类型和值找到变量名列表
private List<String> getNames(String type, String value) {
HashMap<String, List<String>> definition = getDefinition(type); List<String> names = definition.get(value);
if (names == null) {
names = new ArrayList<String>();
definition.put(value, names);
}
return names;
} // 根据类型找到包含值的 Map
private HashMap<String, List<String>> getDefinition(String type) {
HashMap<String, List<String>> definition = definitions.get(type);
if (definition == null) {
definition = new HashMap<String, List<String>>();
definitions.put(type, definition);
}
return definition;
} /**
* 合并定义并输出合并后的语句
*
* @return 合并后的语句,每行为一个元素
*/
public List<String> mergeDifinitions() {
ArrayList<String> result = new ArrayList<String>(); for (String type : definitions.keySet()) {
result.addAll(createDefinition(type, definitions.get(type)));
} return result;
} // 创建指定 type 的定义语句。该 type 有多少个值,就返回多少个语句。
private List<String> createDefinition(String type, HashMap<String, List<String>> values) {
ArrayList<String> result = new ArrayList<String>();
for (String value : values.keySet()) {
result.add(createMergedDefinition(type, value, values.get(value)));
}
return result;
} // 对于一个 type 和一个 value,生成一个合并的定义语句。
private String createMergedDefinition(String type, String value, List<String> names) {
String str = "var ";
for (String name : names) {
str += name + ",";
}
str = StringUtil.cutEnd(str, ",");
str += ":" + type + " = " + value + ";";
return str;
} // 简单的创建一个 List
public <T> List<T> list(T... args) {
return Arrays.asList(args);
}
}/**
* 字符串操作
*/
class StringUtil {
static String cut(String str, String head) {
return str.trim().substring(head.length()).trim();
} public static String before(String str, String token) {
return str.substring(0, str.indexOf(token));
} public static String after(String str, String token) {
return str.substring(str.indexOf(token) + token.length());
} public static String between(String str, String s_before, String s_after) {
return before(after(str, s_before), s_after);
} public static String cutEnd(String str, String end) {
return (str.endsWith(end) && str.length() > end.length()) ?
str.substring(0, str.length() - end.length()) :
str;
}
}
var i:int = 10;可以看出,每个定义语句分为三部分:变量名(var_name)、变量类型(var_type)和值(var_value)三部分。
像上面这句话,可以解析为:var_name="i", var_type="int", var_value="10"
后面就简单写为 name、type 和 value 三个变量了。并不是所有同类型的定义都可以合并成一句,只有类型和值都相同的,才能合并。所以 HashMap<String, HashMap<String, List<String>>> 中,第三个 String 表示变量名,
第二个 String 表示值。同一个值有多个变量名的话,可以考虑合并;但是如果类型不
同的话还要分开。所以第一个 String 表示类型,每个类型包含若干个值,每个值包含若干
个变量名,类型和值都相同的定义才能合并。