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



相关文章
|
6月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
267 4
|
6月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
321 5
|
6月前
|
人工智能 算法 Java
Java与AI驱动区块链:构建智能合约与去中心化AI应用
区块链技术和人工智能的融合正在开创去中心化智能应用的新纪元。本文深入探讨如何使用Java构建AI驱动的区块链应用,涵盖智能合约开发、去中心化AI模型训练与推理、数据隐私保护以及通证经济激励等核心主题。我们将完整展示从区块链基础集成、智能合约编写、AI模型上链到去中心化应用(DApp)开发的全流程,为构建下一代可信、透明的智能去中心化系统提供完整技术方案。
433 3
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
324 1
|
6月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
325 1
|
7月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
305 0
|
7月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
486 16
|
8月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
8月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践