Help the bookseller

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(" - "));
  }
}

猜你喜欢

转载自blog.csdn.net/weixin_36605200/article/details/85221371