只写出伪代码或者略微详细的Demo就好
HashTag是指在一段文字中,以#标识的内容,且不含有空格。比如“this is a #book , that is a #desk .”中有两个HashTag。有如下的类定义,要求补充完整三个方法:
public class HashTagQ {
private TreeMap<String, Integer> map;
public HashTagQ(){
map=new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
}
public LinkedList<String> getHashTags(){
LinkedList<String> list;
//此处代码省略
return list;
}
public void updateMap(LinkedList<String> list){
//补充完整该方法。
//将list中字符串添加到map中。如果有一个hashTag在map中存在,则将其出现次数加1;否则添加该hashTag。
//如果没有则初始化其出现次数为1}
public int sumHashTag(){
//补充完整该方法,统计map中HashTag的出现次数}

解决方案 »

  1.   


    public class HashTagQ {
    public TreeMap<String, Integer> map;

    public HashTagQ(){
    map=new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
    }

    public LinkedList<String> getHashTags(){
    LinkedList<String> list;
    //此处代码省略
    // 这里不明白是不是需要补充
    return list;
    } public void updateMap(LinkedList<String> list){
    //补充完整该方法。
    //将list中字符串添加到map中。如果有一个hashTag在map中存在,则将其出现次数加1;否则添加该hashTag。
    //如果没有则初始化其出现次数为1
    for(String line : list){
    int hashIndex = line.indexOf("#");
    if(hashIndex == -1 || hashIndex == line.length() - 1){
    continue; // 如果这行字符不包括 #, 或者#为最后一个字符,跳过
    }

    String subline = line;

    while(hashIndex != -1){
    subline = subline.substring(hashIndex); //截取包括#在内的字符
    if(subline.length() == 1){
    break;
    }
    if(subline.charAt(1) == 32){ //检查左边第二个字符是不是空格
    subline = subline.substring(1); //截取空格后的字符串
    hashIndex = subline.indexOf("#"); //寻找下一个#的位置
    continue;
    }

    int spaceIndex = subline.indexOf(" "); // 获取空格的下标
    String mapKey = "";
    if(spaceIndex != -1){
    mapKey = subline.substring(0, spaceIndex); //截取 hashtag
    subline = subline.substring(spaceIndex); // 截取下一段字符串
    }else{
    mapKey = subline;
    subline = "";
    }
    map.merge(mapKey, 1, (oldV, newV) -> oldV + 1); // 如果键存在,加一,如果之前不存在,存一
    hashIndex = subline.indexOf("#");
    }
    } } public int sumHashTag(){
    int sum = 0;
    for(Entry<String, Integer> entries : map.entrySet()){
    sum = sum + entries.getValue();
    }
    return sum;
    }
    }
      

  2.   

    写了一个改良版public class HashTagQ {
        private TreeMap<String, Integer> map;    public HashTagQ(){
            map=new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
        }    /*public LinkedList<String> getHashTags(){
            LinkedList<String> list;
            //此处代码省略
            // 这里不明白是不是需要补充
            return list;
        } */    public void updateMap(LinkedList<String> list) {
            //补充完整该方法。
            //将list中字符串添加到map中。如果有一个hashTag在map中存在,则将其出现次数加1;否则添加该hashTag。
            //如果没有则初始化其出现次数为1        Predicate<String> containsHash = line -> line.contains("#");
            Predicate<String> hashNotAtTheEnd = line -> line.indexOf("#") != line.length() - 1;        list.stream()
                    .filter(containsHash.and(hashNotAtTheEnd))
                    .forEach(filteredLine ->{
                        Pattern pattern = Pattern.compile("\\b\\s#[0-9A-Za-z]+\\b");
                        Matcher matcher = pattern.matcher(filteredLine);
                        while (matcher.find()) {
                            int startIndex = matcher.start();
                            int endIndex = matcher.end();
                            String mapKey = "";
                            if (endIndex == filteredLine.length() - 1) {
                                mapKey = filteredLine.substring(startIndex + 1);
                            } else {
                                mapKey = filteredLine.substring(startIndex + 1, endIndex + 1);
                            }
                            map.merge(mapKey, 1, (oldV, newV) -> oldV + 1);
                        }
                    });
        }    public int sumHashTag(){
            int sum = 0;
            for(Map.Entry<String, Integer> entries : map.entrySet()){
                sum = sum + entries.getValue();
            }
            return sum;
        }
    }