对字符串进行归类
使用Map来对字符串进行归类
将数组{“h1”, “h2”, “h2”, “h3”, “h4”, “h4”, “h4”}进行归类,即转换成h1,h2*2,h3,h4*3的形式。
private String formatExecHosts(Map<String, Integer> hm) {
if (hm == null || hm.size() < 1) {
return null;
}
StringBuffer hosts = new StringBuffer();
for (String key : hm.keySet()) {
if (hm.get(key) == 1) {
hosts.append(key);
} else {
hosts.append(key);
hosts.append("*");
hosts.append(hm.get(key));
}
hosts.append(",");
}
return hosts.substring(0, hosts.length() - 1);
}
将机器名和个数放入map
private static Map<String, Integer> mergeHost(Object[] objs) {
if (objs == null || objs.length < 1) {
return null;
}
Map<String, Integer> hm = new HashMap<String, Integer>();
for (Object execHost : objs) {
String h = execHost.toString();
if (!checkHost(hm, h)) {
hm.put(h, 1);
}
}
return hm;
}
若hm中不存在key为host的记录,则返回false;若存在记录,则数值加1,hm.put(h, num)覆盖掉之前的记录
private static boolean checkHost(Map<String, Integer> hm, String host) {
Iterator<String> it = hm.keySet().iterator();
while (it.hasNext()) {
String h = it.next();
if (h.equals(host)) {
Integer num = hm.get(h) + 1;
hm.put(h, num);
return true;
}
}
return false;
}
测试
public static void main(String[] args) throws Exception {
Object[] arr = new Object[]{"h1", "h2", "h2", "h3", "h4", "h4", "h4"};
System.out.println(formatExecHosts(mergeHost(arr)));
}
测试结果
go语言对字符串进行归类
// h1, h1, h2 -> h1*2, h2
func formatHosts(hosts map[string] int) string {
hs := []string{}
for h, n := range hosts {
if n > 1 {
hs = append(hs, fmt.Sprintf("%s*%d", h, n))
} else {
hs = append(hs, h)
}
}
return strings.Join(hs, commaSep)
}
func mergeHost(hosts []string) map[string] int {
hm := make(map[string] int)
for _, h := range hosts {
if _, ok := hm[h]; ok {
hm[h] += 1
} else {
hm[h] = 1
}
}
return hm
}