初识Java 16-3 字符串

news2024/11/17 17:54:32

目录

扫描输入(Scanner)

Scanner的分隔符

使用正则表达式扫描

StringTokenizer


本笔记参考自: 《On Java 中文版》


扫描输入(Scanner

        先看看在Scanner类加入之前,Java是如何处理文件或标准输入的:

【例子:老版本的文本处理】

import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;

public class SimpleRead {
    public static BufferedReader input =
            new BufferedReader(new StringReader(
                    "小红 \n22 1.4514"));

    public static void main(String[] args) {
        try {
            System.out.println("你的名字是什么?");
            String name = input.readLine();
            System.out.println(name);
            System.out.println("你几岁了?" +
                    "你最喜欢的浮点数是多少?");

            System.out.println("请输入:<年龄> <浮点数>");
            String numbers = input.readLine();
            System.out.println(numbers);
            String[] numArray = numbers.split(" ");
            int age = Integer.parseInt(numArray[0]);
            double favorite = Double.parseDouble(numArray[1]);
            System.out.format("你好,%s。%n", name);
            System.out.format("5年后你就" + (age + 5) + "岁了。");
            System.out.format("我最喜欢的浮点数是%f。", favorite / 2);
        }catch (IOException e){
            System.out.println("I/O exception");
        }
    }
}

        程序执行的结果是:

        其中,用于接受输入的代码只有前几行:

内部的StirngReader用于将输入转换为一个可读的流对象,这一对象最终被储存在了BufferedReader对象中。当我们需要使用时,可以配合BufferReaderreadLine()方法:

        这种处理输入的方式在需要拆分输入时会变得尤为复杂(特别是在面对多行输入时):

我们需要先将输入拆分成各个元素,然后逐一处理它们。

        Java 5的Scanner类减轻了处理输入的负担:

【例子:使用Scanner类处理输入文本】

import java.util.Scanner;

public class BetterRead {
    public static void main(String[] args) {
        Scanner stdin = new Scanner(SimpleRead.input);

        System.out.println("你的名字是什么?");
        String name = stdin.nextLine();
        System.out.println(name);

        System.out.println("你几岁了?" +
                "你最喜欢的浮点数是多少?");
        System.out.println("请输入:<年龄> <浮点数>");
        int age = stdin.nextInt();
        double favorite = stdin.nextDouble();
        System.out.println(age + " " + favorite);
        System.out.format("你好,%s。%n", name);
        System.out.format("5年后你就" + (age + 5) + "岁了。");
        System.out.format("我最喜欢的浮点数是%f。", favorite / 2);
    }
}

        程序执行,输出和之前的例子一致:

        Scanner类版本繁多的构造器允许我们输入任何参数,包括FileInputStreamStringReadable等。

        另外,Scanner将输入、分词和解析这些操作都包含在了不同种类的“next”方法中。由于这些方法都只在输入流能够提供一个完整的数据分词时才进行返回,因此在不确定的情况下,可以使用对应的“hasNext”方法进行判断。

    Scanner没有返回IOException,这是因为这个类默认IOException表示输入结束。但我们依旧可以使用它的ioException()方法查看最近发生的异常。

Scanner的分隔符

        Scanner默认使用空格分割输入数据,但也可以使用正则表达式指定特殊的分隔符模式:

【例子:在Scanner中使用正则表达式】

import java.util.Scanner;

public class ScannerDelimiter {
    public static void main(String[] args) {
        Scanner scanner = new Scanner("12, 42, 78, 99, 42");
        scanner.useDelimiter("\\s*,\\s*");
        while (scanner.hasNextInt())
            System.out.println(scanner.nextInt());
    }
}

        程序执行的结果是:

        这种处理方式同样适用于文件输入。


使用正则表达式扫描

        Scanner允许我们自定义正则表达式模式进行扫描,这在面对复杂的数据时很有用。

【例子:扫描防火墙日志,提取威胁数据】

import java.util.Scanner;
import java.util.regex.MatchResult;

public class ThreatAnalyzer {
    static String threatData =
            "51.12.12.32@08/08/2015\n" +
                    "204.45.234.40@08/10/2015\n" +
                    "58.27.82.161@08/11/2015\n";

    public static void main(String[] args) {
        Scanner scanner = new Scanner(threatData);
        String pattern = "(\\d+[.]\\d+[.]\\d+[.]\\d+)@" +
                "(\\d{2}/\\d{2}/\\d{4})";
        while (scanner.hasNext(pattern)) {
            scanner.next(pattern);
            MatchResult match = scanner.match();
            String ip = match.group(1);
            String date = match.group(2);
            System.out.format(
                    "威胁:%s 来自 %s%n", date, ip);
        }
    }
}

        程序执行的结果是:

        注意:由于这种模式只和下一个输入的分词进行匹配。因此在使用分隔符之前,需要注意是否与分词的格式相匹配。

StringTokenizer

        在正则表达式(Java 1.4)和Scanner类(Java 5)被引入之前,Java中对字符串进行拆分的工作大多由StringTokenizer负责。因此这里简单对比不同的技术:

【例子:与StringTokenizer进行比较】

import java.util.Arrays;
import java.util.Scanner;
import java.util.StringTokenizer;

public class ReplacingStringTokenizer {
    public static void main(String[] args) {
        String input = "A B C D E F G";

        StringTokenizer stoke = new StringTokenizer(input);
        while (stoke.hasMoreElements())
            System.out.print(stoke.nextToken() + " ");
        System.out.println();

        System.out.print(Arrays.toString(input.split(" ")));
        System.out.println();

        Scanner scanner = new Scanner(input);
        while (scanner.hasNext())
            System.out.print(scanner.next() + " ");
    }
}

        程序执行的结果是:

        若要以更复杂的形式拆分字符串,StringTokenizer会显得更为乏力。因此StringTokenizer在现在逐渐被淘汰了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1155890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国际物流常见风险如何规避_箱讯科技

外贸物流是国际贸易的重要环节&#xff0c;其管理和效率的高低直接影响着贸易的成本和效益。因此&#xff0c;外贸企业应该重视物流的组织和管理&#xff0c;提高物流运作的效率。 国际物流基础知识 01什么是“双清包税”和“双清不包税” 双清包税上门又叫双清包税到门&…

接口测试学习手册

很多人会谈论接口测试。到底什么是接口测试&#xff1f;如何进行接口测试&#xff1f;这篇文章会帮到你。 前端和后端 在谈论接口测试之前&#xff0c;让我们先明确前端和后端这两个概念。 前端是我们在网页或移动应用程序中看到的页面&#xff0c;它由 HTML 和 CSS 编写而成…

天软特色因子看板(2023.10 第13期)

该因子看板跟踪天软特色因子A05005(近一月单笔流涌金额占比(%)&#xff0c;该因子为近一个月单笔流通金额占比因&#xff0c;用以刻画股票在收盘时&#xff0c;主力资金在总交易金额中所占的比重。 今日为该因子跟踪第11期&#xff0c;跟踪其在SW801150 (申万医药生物) 中的表现…

STM32-RTC实时时钟

RTC实时时钟 STM32的RTC外设&#xff0c;实质上是一个掉电后还继续运行的定时器。类似于通用定时器TIM外设&#xff0c;可以计时和触发中断。 掉电指的是电源VDD断开时为了RTC外设掉电继续运行&#xff0c;必须接上锂电池给STM32的RTC、备份发卡通过Vbat引脚供电。当主电源VDD有…

TensorBoard官方教程

如何在 PYTORCH 中使用 TENSORBOARD&#xff1a;https://pytorch.org/tutorials/recipes/recipes/tensorboard_with_pytorch.html 更详细一点的&#xff1a;https://pytorch.org/docs/stable/tensorboard.html 主要是 一个函数 writer.add_scalar()

JavaScript基础知识19——循环结构:while循环

哈喽&#xff0c;你好&#xff0c;我是雷工。 本节学习JavaScript基础语法的循环结构&#xff1a;while循环&#xff0c;以下为学习笔记。 while循环 循环概念&#xff1a;重复执行一些操作&#xff1b; 循环特征&#xff1a;不断地重复&#xff1b; while&#xff1a;在…期间…

echarts 力向导图_关系图_知识图谱

Echarts 常用各类图表模板配置 注意&#xff1a; 这里主要就是基于各类图表&#xff0c;更多的使用 Echarts 的各类配置项&#xff1b; 以下代码都可以复制到 Echarts 官网&#xff0c;直接预览&#xff1b; 图标模板目录 Echarts 常用各类图表模板配置一、力向导图二、环形图…

VS Code开发Java之快速入门

VS Code 开发Java的环境 要在VS Code中开发Java应用程序&#xff0c;需要安装以下组件&#xff1a; Java Development Kit&#xff08;JDK&#xff09;&#xff1a;JDK是Java开发的基础&#xff0c;需要下载和安装JDK。Visual Studio Code&#xff1a;VS Code是一个免费的跨平…

Freertos tick 不响应中断的解决方法

代码环境 babyosfreertos 操作方法 通过 shell 操作eeprom 的写操作 问题现象 整个系统会卡在延时函数这里&#xff0c;卡的原因是rtos 的tick中断不响应了。 shell不响应外部命令 系统是正常运行的。 解决方法 成功的方法 ms延时由依赖tick改为us的堵塞延时&#xff1…

虚拟化的基础知识

目录 虚拟化基础 虚拟化的概念 虚拟化的特征&#xff08;本质&#xff09; 虚拟机的两大派别 VMM讲解 虚拟化中的一些重要概念 VMM的功能以及分类 虚拟化的架构 寄居虚拟化 裸金属虚拟化 操作系统虚拟化 混合虚拟化 虚拟化的三个方向 虚拟化基础 虚拟化的概念 什…

VMware打开centos黑屏解决方法汇总

VMware打开centos黑屏解决方法汇总 前言&#xff1a;一. VMware打开centos黑屏解决方法汇总一 .情况情况一&#xff1a;情况二情况三 二. 解决方法最简单的方法&#xff1a;一. 以管理员权限在命令行执行1. 管理员身份运行cmd2. 输入“netsh winsock reset”,回车3. 重启电脑即…

世界电信日 | 人大金仓助力中国移动租赁核算系统升级上线

世界电信日 5月17日恰逢第五十四个世界电信日&#xff0c;运营商作为新型基础设施建设以及维护网信安全的主力军&#xff0c;掌握关键核心技术&#xff0c;实现科技自立自强刻不容缓。 作为数据库领域国家队&#xff0c;人大金仓坚持原始创新&#xff0c;低难度、低成本、低风…

【广州华锐视点】节省成本,提升效果!教你快速搭建一个元宇宙3D虚拟展厅!

在当今这个数字化的时代&#xff0c;拥有一个专业的网站或者小程序已经成为了企业展示形象、推广产品的重要手段。然而&#xff0c;对于许多小企业来说&#xff0c;高昂的开发费用和复杂的技术门槛往往成为了他们实现这一目标的最大阻碍。那么&#xff0c;有没有一种方式&#…

两个字符串的最小ASCII删除和

题目描述 给定两个字符串s1 和 s2&#xff0c;返回 使两个字符串相等所需删除字符的 ASCII 值的最小和 。 示例 思路 这个题的解法一和最长公共子序列的解法大致相同&#xff0c;我们可以在此代码基础上稍微更改即可。 代码如下 解法一 public int minimumDeleteSum1(Stri…

【Spring】DI依赖注入,Lombok以及SpEL

文章目录 1.什么是DI依赖注入2. set方法注入3. ref属性4. 有参构造方法注入5. Lombok6. SpEL 1.什么是DI依赖注入 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;也是Spring框架的核心概念之一。其基本思想是将程序中的各…

基于和声算法的无人机航迹规划-附代码

基于和声算法的无人机航迹规划 文章目录 基于和声算法的无人机航迹规划1.和声搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用和声算法来优化无人机航迹规划。 1.和声搜索算法 …

openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置

文章目录 openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置111.1 给用户直接授予某对象的权限111.2 给用户指定角色111.3 回收用户权限 openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置 111.1 给用户直接授予某对象的权限 …

git更改鼠标颜色

git bash命令行&#xff0c;默认黑底白字、鼠标移近无法看清鼠标移动范围。 1、控制面板-打开鼠标属性-指针。 选择 windows 黑色&#xff08;系统方案) 保存

C++ 对象数组(整理)

C对象数组 一、对象数组的定义二、对象数组的特性三、对象数组的使用3.1 构造函数没有参数3.2 构造函数有一个参数3.3 构造函数有多个参数 四、为什么要使用对象数组&#xff1f; 一、对象数组的定义 所谓对象数组&#xff0c;指每一个数组元素都是对象的数组&#xff0c;即若…

原来服务器这么有用-创建一个自己的云存储:FileBrowser

原来服务器这么有用-创建一个自己的云存储&#xff1a;FileBrowser 1、介绍 filebrowser 是一个使用go语言编写的软件&#xff0c;功能是可以通过浏览器对服务器上的文件进行管理。 Filebrowser提供了一个在指定目录内进行文件管理的界面&#xff0c;可以用于上传、删除、预览…