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



相关文章
|
19小时前
|
Java 测试技术 C++
滚雪球学Java(63):Java高级集合之TreeSet:什么是它,为什么使用它?
【6月更文挑战第17天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
7 0
滚雪球学Java(63):Java高级集合之TreeSet:什么是它,为什么使用它?
|
1天前
|
监控 Java 数据安全/隐私保护
性能监控之 JMX 监控 Docker 容器中的 Java 应用
【6月更文挑战9天】性能监控之 JMX 监控 Docker 容器中的 Java 应用
16 1
|
2天前
|
Java 开发者
Java 面向对象编程实战:从类定义到对象应用,让你成为高手!
【6月更文挑战第15天】在Java中,掌握面向对象编程至关重要。通过创建`Book`类,展示了属性如`title`和`author`,以及构造方法和getter方法。实例化对象如`book1`和`book2`,并访问其属性。进一步扩展类,添加`pages`和`calculateReadingTime`方法,显示了类的可扩展性。在更大规模的项目中,如电商系统,可以定义`Product`、`User`和`Order`类,利用对象表示实体和它们的交互。实践是精通Java OOP的关键,不断学习和应用以提升技能。
|
2天前
|
Java 开发者
为什么 Java 的类和对象如此重要?看完这篇你就懂了!
【6月更文挑战第15天】在Java中,类和对象是核心概念。类作为蓝图定义数据(如角色的名称和健康值)和行为(如`takeDamage`方法),而对象是类的实例,允许交互(如战士受伤)。通过继承,如`Circle`和`Rectangle`扩展`Shape`类,实现多态性,增强代码灵活性。类和对象促进代码组织、复用和可维护性,是高效软件开发的基础。
|
2天前
|
设计模式 Java
一文掌握 Java 面向对象精髓:从类定义到对象实战
【6月更文挑战第15天】Java面向对象编程初学者指南:类是对象模板,如`Person`类含`name`和`age`属性。创建对象用`new`,如`Person person = new Person()`。访问属性如`person.name=&quot;Alice&quot;`,调用方法如`person.sayHello()`。类能继承,如`Student extends Person`。对象间共享数据可传参或共用引用。多态性允许父类引用调用子类方法。注意对象生命周期和内存管理,避免内存泄漏。通过实践和理解这些基础,提升编程技能。
|
2天前
|
Java
深入 Java 面向对象:类的定义,竟然藏着这么多门道!
【6月更文挑战第15天】Java中的类定义是OOP的基础,它封装属性(如Student的name和age)和行为(如study())。简单的类仅触及表面,而复杂的类可模拟真实世界对象的多样性和交互。类还可通过继承扩展,如Student从Person派生,增加特有属性和行为。接口和抽象类等概念进一步增强了灵活性和可扩展性。类定义的深度和广度是构建高效、可维护代码的关键。
|
2天前
|
Java
别再被 Java 类和对象绕晕了!一篇文章让你秒懂!
【6月更文挑战第15天】Java中的类是对象的模板,定义属性(如姓名、年龄)和行为(如走路、说话)。对象是类的实例,有自己的属性值。例如,`Person`类可创建`Person`对象,赋予属性值并调用方法。同样,`Car`类可创建不同品牌的汽车对象,每个对象能加速或刹车。理解类与对象的关系是Java面向对象编程的基础。
|
SQL 存储 Java
Java 应用与数据库的关系| 学习笔记
快速学习 Java 应用与数据库的关系。
175 0
Java 应用与数据库的关系| 学习笔记
|
SQL 存储 Java
Java 应用与数据库的关系| 学习笔记
快速学习 Java 应用与数据库的关系。
169 0
Java 应用与数据库的关系| 学习笔记
|
SQL 存储 关系型数据库
Java应用与数据库的关系|学习笔记
快速学习Java应用与数据库的关系
Java应用与数据库的关系|学习笔记