Help the bookseller
题目描述
A bookseller has lots of books classified in 26 categories labeled A, B, ... Z. Each book has a code c of 3, 4, 5 or more capitals letters. The 1st letter of a code is the capital letter of the book category. In the bookseller's stocklist each code c is followed by a space and by a positive integer n (int n >= 0) which indicates the quantity of books of this code in stock.
题目的例子
L = {"ABART 20", "CDXEF 50", "BKWRK 25", "BTSQZ 89", "DRTYM 60"}or
L = ["ABART 20", "CDXEF 50", "BKWRK 25", "BTSQZ 89", "DRTYM 60"]
M = {"A", "B", "C", "W"}or
M = ["A", "B", "C", "W"]
return (A : 20) - (B : 114) - (C : 50) - (W : 0)
题目大意:大概是说书店的书籍分类为26个字母A~Z开头,L里面每一个元素的第一个大写字母是书籍的分类,后面的数字是该类书籍的数量,如"ABART 20",A类书籍是20本,M说明的是要计算这类书的数量,如M中的B类数对应例子中的"BKWRK 25", "BTSQZ 89",共有114本,输出格式为(x : 数量) - (x : 数量)....
实现思路
利用map数据结构来存储结果,StringBuffer进行后面的字符串拼接,对lstOfArt字符串数组即例子中的L进行遍历,截取每个字符的开头,即书籍的分类,截取空格后的数字,代表该类书籍的数量,判断map当中时候包含该书籍分类的键值了,存在就进行该类书籍数目的累加,最后在更新map里面的数据,不存在就直接添加。然后对lstOf1stLetter即例子中的M进行遍历,与map里面的键进行匹配,匹配到就直接添加到StringBuffer里面,格式"("+s+" : "+map.get(s)+") - ",匹配不到的格式为"("+s+" : "+0+") - ",并添加到StringBuffer,最后对StringBuffer转换成字符串并且要进行截取,因为后面有多余的字符串“空格-空格”。
实现代码
import java.util.*;
public class StockList {
// 1st parameter is the stocklist (L in example),
// 2nd parameter is list of categories (M in example)
public static String stockSummary(String[] lstOfArt, String[] lstOf1stLetter) {
if(lstOfArt.length==0||lstOf1stLetter.length==0)return "";
Map<String,Integer> map=new HashMap<String,Integer>();
StringBuffer sb=new StringBuffer();
for(String str:lstOfArt){
String c=str.substring(0,1).toString();
int num=Integer.parseInt(str.substring(str.indexOf(" ")+1,str.length()));
if(map.containsKey(c)){
num+=map.get(c);
}
map.put(c,num);
}
for(String s:lstOf1stLetter){
if(map.get(s)==null){
sb.append("("+s+" : "+0+") - ");
}
else sb.append("("+s+" : "+map.get(s)+") - ");
}
return sb.toString().substring(0,sb.length()-3);
}
}
优秀coder的code
import java.util.stream.Stream;
import java.util.stream.Collectors;
public class StockList {
public static String stockSummary(String[] arts, String[] cats) {
if (arts.length == 0) return "";
final int space = arts[0].indexOf(" ");
return Stream.of(cats)
.map(c -> c + " : " + Stream.of(arts)
.filter(a -> c.contentEquals(a.subSequence(0, 1)))
.map(a -> a.substring(space + 1))
.mapToInt(Integer::parseInt)
.sum())
.map(s -> "(" + s + ")")
.collect(Collectors.joining(" - "));
}
}
import java.util.Map;
import static java.util.Arrays.stream;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.summingInt;
import static java.util.stream.Collectors.joining;
public class StockList {
private static int stockCount(final String s) {
return Integer.valueOf(s.split(" ")[1]);
}
public static String stockSummary(final String[] stock, final String[] categories) {
if (stock.length == 0 || categories.length == 0)
return "";
final Map<String, Integer> counts = stream(stock)
.collect(groupingBy(s -> s.substring(0, 1), summingInt(StockList::stockCount)));
return stream(categories)
.map(s -> "(" + s + " : " + counts.getOrDefault(s, 0) + ")")
.collect(joining(" - "));
}
}