Java集合类ArrayList应用 | 如何在字符串s1中删除有在字符串s2出现的字符?

简介: 这是一个关于Java编程面试题的摘要,题目要求从字符串s1中删除s2中存在的字符。解题思路包括使用ArrayList或StringBuilder实现。ArrayList实现时,遍历s1,如果字符不在s2中,则添加到ArrayList;StringBuilder实现有两种方法,一是新建StringBuilder并追加s1,然后遍历删除s2中的字符,二是直接在原地修改s1的StringBuilder对象。代码示例中展示了这些方法。

一、题干


面试的编程题:

s1: "welcome to Zhejiang"

s2: "come"

要求输出从字符串s1删除s2中存在的字符之后的结果。如运行后,输出:"wl t Zhjiang"


二、题解


1. 思路


ArrayList实现


这道题的思路并不复杂,要从s1中删除s2中存在的字符,只需要遍历字符串s1的每个字符,依次对比它是否在s2中出现。出现了的删去,没有出现的留下。如何运用集合类ArrayList进行实现呢?可能也不难想到,只需将s1中需要留下的字符存入顺序表即可。


在编写代码时,其中有一些细节需要我们注意:


  1. 由于是将需要留下的字符存入ArrayList中,因此在实例化ArrayList时,应当采取泛型类ArrayList<Character>:


ArrayList<Character> list = new ArrayList<>();


  1. 检查s2中是否包含s1的字符,调用字符串方法contains()即可。但要注意,若写作s2.contains(ch)是不正确的(ch是char类型)。因为contains()方法的参数类型为CharSequence,与char类型是不匹配的。



因此,每次使用字符串类的contains()方法前,必须要先将待查找的char字符转换成CharSequence类型。在本文文末补充了CharSequence相关的知识。 CharSequence实际上是一个接口,而String类就实现了这个接口。因此,通过ch+""或String.valueOf(ch)将char类型转换为String类型即可。


该方法的本质就是创建一个新的空间(可以是ArrayList类型,也可以是普通的char数组),也可以用StringBuilder类型实现。下面代码中的StringBuilder实现-1与StringBuilder实现-2即为对应的代码。



2. 代码

ArrayList实现

import java.util.ArrayList;
 
public class Test {
    public static void main(String[] args) {
        ArrayList<Character> list = new ArrayList<>();
        String s1 = "welcome to Zhejiang";
        String s2 = "come";
 
        for (int i = 0; i < s1.length(); i++) {
            char ch = s1.charAt(i);
            if(!s2.contains(String.valueOf(ch))) {
                list.add(ch);
            }
        }
        //System.out.println(list);  打印出的格式不符合要求
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i));
        }
    }
}


StringBuilder实现-1


public class Test {
    public static void main(String[] args) {
        String s1 = "welcome to Zhejiang";
        String s2 = "come";
        StringBuilder ret = new StringBuilder();
 
        for (int i = 0; i < s1.length(); i++) {
            char ch = s1.charAt(i);
            if(!s2.contains(String.valueOf(ch))) {
                ret.append(ch);    //StringBuilder的追加方法
            }
        }
 
        for (int i = 0; i < ret.length(); i++) {
            System.out.print(ret.charAt(i));
        }
    }
}


StringBuilder实现-2

import java.util.ArrayList;
 
public class Test {
    public static void main(String[] args) {
        ArrayList<Character> list = new ArrayList<>();
        String s1 = "welcome to Zhejiang";
        String s2 = "come";
        StringBuilder stringBuilder = new StringBuilder(s1);    
        //创建一个内容与s1相同的stringbuilder类,该代码对它来说是原地的
 
        for (int i = 0; i < stringBuilder.length(); i++) {
            char ch = stringBuilder.charAt(i);
            if(s2.contains(String.valueOf(ch))) {
                stringBuilder.deleteCharAt(i);
                i--;
            }
        }
        System.out.println(stringBuilder);
    }
}


三、总结


  1. 本题难度并不大,初学集合类或对集合类不太熟悉的同学可以浏览学习一下,从易到难了解Java集合类的各种方法以及相关应用。


  1. 本题的实现方法有很多,本文列举了用StringBuilder类实现的另两种方式,主要熟悉append()方法与deleteCharAt()方法的使用。


  1. 知识点补充:Interface CharSequence



相关文章
|
27天前
|
消息中间件 算法 安全
JUC并发—1.Java集合包底层源码剖析
本文主要对JDK中的集合包源码进行了剖析。
|
2月前
|
Java 开发者
重学Java基础篇—Java类加载顺序深度解析
本文全面解析Java类的生命周期与加载顺序,涵盖从加载到卸载的七个阶段,并深入探讨初始化阶段的执行规则。通过单类、继承体系的实例分析,明确静态与实例初始化的顺序。同时,列举六种触发初始化的场景及特殊场景处理(如接口初始化)。提供类加载完整流程图与记忆口诀,助于理解复杂初始化逻辑。此外,针对空指针异常等问题提出排查方案,并给出最佳实践建议,帮助开发者优化程序设计、定位BUG及理解框架机制。最后扩展讲解类加载器层次与双亲委派机制,为深入研究奠定基础。
93 0
|
1月前
|
Java 数据安全/隐私保护
Java 类和对象
本文介绍了Java编程中类和对象的基础知识,作为面向对象编程(OOP)的核心概念。类是对象的蓝图,定义实体类型;对象是具体实例,包含状态和行为。通过示例展示了如何创建表示汽车的类及其实例,并说明了构造函数、字段和方法的作用。同时,文章还探讨了访问修饰符的使用,强调封装的重要性,如通过getter和setter控制字段访问。最后总结了类与对象的关系及其在Java中的应用,并建议进一步学习继承等概念。
|
1月前
|
Java
Java LinkedList集合的深度剖析
总的来说,我希望像说故事一样讲解Java LinkedList集合的使用和实现原理,让有些许枯燥的编程知识变得趣味盎然。在这个“公交车”故事中,你不仅熟悉了LinkedList集合的实现和使用,而且还更深入地理解了数据结构中的链表。链表可能会因为插入和删除的便利性而被选用,虽然它的查找效率并不高,但是在很多场景中仍然十分有效。这就像公交车,虽然它速度不快,但却是城市出行的重要工具。
58 8
|
2月前
|
存储 缓存 安全
Java 字符串详解
本文介绍了 Java 中的三种字符串类型:String、StringBuffer 和 StringBuilder,详细讲解了它们的区别与使用场景。String 是不可变的字符串常量,线程安全但操作效率较低;StringBuffer 是可变的字符串缓冲区,线程安全但性能稍逊;StringBuilder 同样是可变的字符串缓冲区,但非线程安全,性能更高。文章还列举了三者的常用方法,并总结了它们在不同环境下的适用情况及执行速度对比。
102 17
|
2月前
|
存储 缓存 安全
Java字符串缓冲区
字符串缓冲区是用于处理可变字符串的容器,Java中提供了`StringBuffer`和`StringBuilder`两种实现。由于`String`类不可变,当需要频繁修改字符串时,使用缓冲区更高效。`StringBuffer`是一个线程安全的容器,支持动态扩展、任意类型数据转为字符串存储,并提供多种操作方法(如`append`、`insert`、`delete`等)。通过这些方法,可以方便地对字符串进行添加、插入、删除等操作,最终将结果转换为字符串。示例代码展示了如何创建缓冲区对象并调用相关方法完成字符串操作。
63 13
|
2月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:输入与输出:Scanner与System类
你是否也经历过这些崩溃瞬间?三天教程连`i++`和`++i`都说不清,面试时`a==b`与`equals()`区别大脑空白,代码总是莫名报NPE。这个系列就是为你打造的Java「速效救心丸」!每天1分钟,地铁通勤、午休间隙即可学习。直击高频考点和实际开发中的“坑位”,拒绝冗长概念,每篇都有可运行代码示例。涵盖输入输出基础、猜数字游戏、企业编码规范、性能优化技巧、隐藏技能等。助你快速掌握Java核心知识,提升编程能力。点赞、收藏、转发,助力更多小伙伴一起成长!
57 19
|
2月前
|
存储 监控 安全
重学Java基础篇—类的生命周期深度解析
本文全面解析了Java类的生命周期,涵盖加载、验证、准备、解析、初始化、使用及卸载七个关键阶段。通过分阶段执行机制详解(如加载阶段的触发条件与技术实现),结合方法调用机制、内存回收保护等使用阶段特性,以及卸载条件和特殊场景处理,帮助开发者深入理解JVM运作原理。同时,文章探讨了性能优化建议、典型异常处理及新一代JVM特性(如元空间与模块化系统)。总结中强调安全优先、延迟加载与动态扩展的设计思想,并提供开发建议与进阶方向,助力解决性能调优、内存泄漏排查及框架设计等问题。
75 5
|
2月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
80 11
|
1月前
|
存储 安全 Java
Java 集合框架详解:系统化分析与高级应用
本文深入解析Java集合框架,涵盖List、Set、Map等核心接口及其常见实现类,如ArrayList、HashSet、HashMap等。通过对比不同集合类型的特性与应用场景,帮助开发者选择最优方案。同时介绍Iterator迭代机制、Collections工具类及Stream API等高级功能,提升代码效率与可维护性。适合初学者与进阶开发者系统学习与实践。
62 0