Java高级特性 - 集合框架(1)

第1关:集合的基本使用

任务描述

本关任务:创建集合并添加数据。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,创建ArrayList集合并且向集合中添加数据,具体要求如下:

  • 添加字符串类型数据:https:www.educoder.net

  • 添加double类型数据:2018.423

  • 在方法中返回你创建的集合对象。

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

预期输出:
https:www.educoder.net
2018.423


package step1;
import java.util.ArrayList;
public class Task1 {
    @SuppressWarnings("unchecked")
    public ArrayList getList() {
        /********** Begin **********/
        ArrayList list=new ArrayList();
        list.add("https:www.educoder.net");
        list.add(2018.423);
        return list;
    }
}

第2关:ArrayList集合的增删改查

任务描述

本关任务:完成对集合中数据的增删改查。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

  • 删除集合的第一个和最后一个元素;

  • 添加两个字符串:helloeducoder至集合中;

  • 修改集合的第三个元素,改为:list

  • 输出集合中所有的元素。

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

测试输入:

4
张三
李四
王五
赵六

预期输出:

李四
王五
list
educoder


package step2;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

class HelloWorld {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        //获取输入的数据并添加至集合
        Scanner sc = new Scanner(System.in);
        ArrayList list = new ArrayList<>();
        int length = sc.nextInt();
        for(int i =0 ; i< length; i++){
            list.add(sc.next());
        }

        list.remove(0);
        list.remove(list.size()-1);
        list.add("hello");
        list.add("educoder");
        list.set(2,"list");
        Iterator iterator=list.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }
}

第3关:集合的体系结构

任务描述

本关任务:

定义四种开发中常用的集合并添加数据。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

  • 分别定义HashSetArrayListLinkedListHashMap集合。并向每一个集合中添加www.educoder.netMap集合的key设置为address,最后将每一个集合返回。

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

测试输入:
预期输出:
www.educoder.net
www.educoder.net
www.educoder.net
www.educoder.net


package step3;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

public class HelloWorld {

    public HashSet getHashSet(){
        /********** Begin **********/
        HashSet set=new HashSet();
        set.add("www.educoder.net");
        return set;
        /********** End **********/
    }

    public ArrayList getArrayList(){
        /********** Begin **********/
        ArrayList arrayList=new ArrayList();
        arrayList.add("www.educoder.net");
        return arrayList;
        /********** End **********/
    }

    public LinkedList getLinkedList(){
        /********** Begin **********/
        LinkedList linkedList=new LinkedList();
        linkedList.add("www.educoder.net");
        return  linkedList;
        /********** End **********/
    }

    public Map getHashMap(){
        /********** Begin **********/
        HashMap map=new HashMap();
        map.put("address","www.educoder.net");
        return map;
        /********** End **********/
    }

}

第4关:泛型

任务描述

本关任务:使用泛型创建集合对象。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

  • 创建一个只能存储String类型数据的List集合;

  • 将程序输入的数据存入List集合中;

  • 输出集合中所有的数据。

提示:list.size()方法可以获取集合的长度。

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

测试输入:
张三
李四
王五

预期输出:
集合的第1个数据为:张三
集合的第2个数据为:李四
集合的第3个数据为:王五


package step4;

import java.util.*;

public class HelloWorld {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //程序会输入三次数据
        /********** Begin **********/
        List<String> list=new ArrayList<String>();
        for(int i=1;i<=3;i++){
            list.add(sc.nextLine());
        }
        for(int i=0;i<list.size();i++){
            System.out.print("集合的第"+(i+1)+"个数据为:");
            System.out.println(list.get(i));
        }
        /********** End **********/
    }

}

第5关:Map集合的增删改查

任务描述

本关任务:对Map集合进行增删改查操作。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

  • menuDict集合中添加一道菜名lamb,它的价格是50

  • 获取menuDict集合中的fish的价格并打印出来;

  • menuDict集合中的fish的价格改为100

  • 删除menuDict集合中noodles这道菜;

  • 输出新的menuDict菜单。

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

pizza
40
noodles
30
carrot
20
turkey
34
fish
37

预期输出:

37
{pizza=40,turkey=34,fish=100,lamb=50,carrot=20}


package step5;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class HelloWorld {

    public static void main(String[] args) {
        Map<String, Integer> menuDict = new HashMap<>();
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 5; i++) {
            menuDict.put(sc.next(),sc.nextInt());
        }
        /********** Begin **********/
        menuDict.put("lamb",50);
        System.out.println(menuDict.get("fish"));
        menuDict.put("fish",100);
        menuDict.remove("noodles");
        System.out.println(menuDict.toString());
        /********** End **********/
    }

}

<think>好的,我需要帮助用户在Java中使用HashMap和StringTokenizer实现单词频率统计并按降序排序。首先,用户提到了要使用这两个特定的类,所以我得确保解决方案中确实用到了它们。 首先,我需要回忆一下HashMap和StringTokenizer的基本用法。HashMap用于存储键值对,这里应该是单词作为键,出现次数作为值。StringTokenizer则用来分割字符串,根据指定的分隔符将文本拆分成单词。用户可能希望按照常见分隔符比如空格、标点来分割,所以我需要正确设置StringTokenizer的分隔符参数。 接下来,步骤大概是这样的:读取文件内容,分割单词,统计频率,然后排序输出。不过用户可能只需要核心代码部分,比如处理字符串和统计的部分。例如,使用StringTokenizer遍历每个单词,将它们转换为小写(避免大小写不同造成的统计差异),然后放入HashMap中计数。 然后是关于排序的部分。因为HashMap本身是无序的,所以需要将Entry转换到List中,再使用Collections.sort并自定义比较器,按值降序排列。这里需要写一个Comparator,比较两个Entry的值,返回相反的差值以实现降序。 可能需要考虑异常处理,比如文件读取时的IOException,但用户可能更关注核心逻辑。另外,用户之前的问题中引用了使用TreeMap和自定义比较器的例子,不过这里需要用HashMap,所以排序部分可能需要不同的处理方式。例如,将HashMap的EntrySet转存到List,然后排序这个List。 现在,我需要确保代码示例正确无误。比如,正确初始化StringTokenizer,使用默认的分隔符(空格、换行、制表符等),或者显式指定分隔符如“ ,.!?”等。可能还需要处理单词中的标点符号,比如在分割后去除单词前后的非字母字符,比如用replaceAll("[^a-zA-Z]", "")来清理每个单词。 然后,统计完毕后,如何将结果排序。例如,创建一个List<Map.Entry<String, Integer>>,然后使用Collections.sort并传入自定义的Comparator,比较两个Entry的值,降序排列。 最后,遍历排序后的列表,输出单词和频率。需要确保代码示例中这部分正确,比如如何获取Entry的键和值。 现在,可能需要参考用户提供的引用内容。引用[1]中提到用split方法分割字符串,但这里用户要求用StringTokenizer,所以需要替换成相应的代码。引用[2]中的TreeMap和自定义比较器可能对排序部分有帮助,但这里需要用HashMap,所以需要调整。 可能的代码结构如下: 1. 读取文件内容到字符串。 2. 使用StringTokenizer分割单词。 3. 遍历单词,统计到HashMap。 4. 将Entry转换为List。 5. 自定义比较器按值降序排序。 6. 输出结果。 需要注意的是,StringTokenizer默认的分隔符可能不够,可能需要指定更多的分隔符,比如标点符号。或者,在分割之后对每个单词进行清理,去除非字母字符。 例如,初始化StringTokenizer时,可以指定分隔符为“ \t\n\r\f,.;:!?‘’”“”等。或者,在获取每个token后,使用正则表达式替换掉非字母字符。 另外,用户可能需要不区分大小写,所以在放入HashMap之前,将单词转为小写或大写。 在代码示例中,可能需要处理这些步骤。例如: StringTokenizer st = new StringTokenizer(text, " ,.!?;:\"'()"); while (st.hasMoreTokens()) { String word = st.nextToken().toLowerCase().replaceAll("[^a-z]", ""); if (!word.isEmpty()) { map.put(word, map.getOrDefault(word, 0) + 1); } } 这样处理每个单词,转为小写,去除非字母字符,并过滤空字符串。 然后排序部分: List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o2.getValue().compareTo(o1.getValue()); // 降序 } }); 最后遍历list输出结果。 需要确保这些步骤正确,并且符合用户的需求。此外,用户可能需要完整的代码示例,包括导入包、主方法结构等,或者只需要关键代码片段。根据问题描述,用户可能需要补充指定区域的代码,所以可能需要给出核心部分的代码。 另外,用户引用的内容中提到了使用split方法和TreeMap,但这里需要调整成StringTokenizer和HashMap。例如,引用[2]中的代码使用了TreeMap和自定义比较器,但这里可能不需要TreeMap,而是用HashMap配合List排序。 总结,正确的步骤是使用StringTokenizer分割单词,统计到HashMap,然后转换为List并排序,最后输出。需要确保代码中的各部分正确,特别是分隔符的设置和单词的清理,以及排序的正确性。</think>在Java中使用HashMap和StringTokenizer实现单词频率统计并按降序排序,可通过以下步骤实现: --- ### **实现步骤** 1. **读取文本内容** 2. **使用StringTokenizer分割单词** 3. **用HashMap统计频率** 4. **转换为List并排序** 5. **输出结果** --- ### **完整代码示例** ```java import java.util.*; import java.io.*; public class WordFrequencyCounter { public static void main(String[] args) throws IOException { String text = "Your text content here"; // 替换为实际文本或文件读取逻辑 Map<String, Integer> wordMap = new HashMap<>(); // 分割单词(按空格、标点符号分隔) StringTokenizer st = new StringTokenizer(text, " ,.!?;:\"'()\t\n\r\f"); while (st.hasMoreTokens()) { String word = st.nextToken().toLowerCase().replaceAll("[^a-z]", ""); if (!word.isEmpty()) { wordMap.put(word, wordMap.getOrDefault(word, 0) + 1); } } // 转换为List并排序 List<Map.Entry<String, Integer>> sortedList = new ArrayList<>(wordMap.entrySet()); Collections.sort(sortedList, (o1, o2) -> o2.getValue().compareTo(o1.getValue())); // 输出结果 for (Map.Entry<String, Integer> entry : sortedList) { System.out.println(entry.getKey() + ": " + entry.getValue()); } } } ``` --- ### **关键逻辑说明** 1. **单词分割** - `StringTokenizer` 使用分隔符集合 `" ,.!?;:\"'()\t\n\r\f"` 切分文本,覆盖常见标点和空白符[^1]。 - 通过 `replaceAll("[^a-z]", "")` 清理非字母字符,确保单词格式统一。 2. **频率统计** - `HashMap` 的 `getOrDefault()` 方法简化计数逻辑,自动处理首次出现的单词。 3. **降序排序** - 将 `entrySet()` 转为 `List`,通过自定义比较器按值降序排列(`o2.compareTo(o1)`)。 --- ### **优化建议** - **文件读取**:若需处理文件,可用 `BufferedReader` 读取文本: ```java StringBuilder sb = new StringBuilder(); try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) { String line; while ((line = br.readLine()) != null) { sb.append(line).append(" "); } } String text = sb.toString(); ``` - **性能提升**:大文件可改用 `ConcurrentHashMap` 并行处理[^3]。 - **过滤停用词**:添加停用词列表(如 "the", "and")以忽略常见词。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值