0

0

从字符及其位置映射重建字符串:Java教程

心靈之曲

心靈之曲

发布时间:2025-09-23 20:47:00

|

613人浏览过

|

来源于php中文网

原创

从字符及其位置映射重建字符串:java教程

本文介绍如何利用字符及其在原始字符串中的位置信息,通过 Java 集合和流操作,高效地重建原始字符串。文章详细讲解了实现步骤,包括创建辅助类型、排序字符位置、处理空格以及使用 Collectors.joining() 方法生成最终字符串,并提供完整的代码示例。

问题背景

假设我们已经将一个字符串分割成单个字符,并记录了每个字符在原始字符串中的位置索引。我们的目标是利用这些信息,包括字符及其位置的映射关系,重新构建出原始的字符串,包括原始字符串中的空格。

解决方案

解决此问题的核心在于利用 Java 集合和流 API,将字符位置信息进行排序,并正确地将字符放置回其原始位置。以下是详细的步骤和代码示例:

1. 定义辅助类型 CharPosition

立即学习Java免费学习笔记(深入)”;

为了方便处理字符及其位置信息,我们定义一个辅助类型 CharPosition,用于存储字符和其对应的位置索引。这里使用 Java 16 的 record 类型,可以简洁地表示数据类。

public record CharPosition(String ch, int pos) {}

2. 创建 CharPosition 列表并排序

首先,我们需要将字符及其位置的映射关系转换为 CharPosition 对象的列表。然后,按照位置索引对列表进行排序。

import java.util.*;
import java.util.stream.Collectors;
import java.util.Arrays;
import java.util.Objects;

public class StringReconstruction {

    private static final String text = "Hello Word!";
    static Map> charsIndex = new HashMap<>();

    static void charsIndex() {

        List charsList = text
                .chars()
                .mapToObj(e -> (char) e)
                .toList();
        System.out.println(charsList);

        int  position = 0;
        for (Character c : charsList) {
            if(!c.toString().isBlank()){
                charsIndex.computeIfAbsent(c.toString(),
                        addCharPosition -> new ArrayList<>()).add(position);
            }
            position += 1;
        }

        System.out.println(charsIndex);
    }

    public record CharPosition(String ch, int pos) {}

    static void charsToString() {

        List charPositions = charsIndex.entrySet().stream()
                .flatMap(entry -> entry.getValue().stream()
                        .map(pos -> new CharPosition(entry.getKey(), pos))
                )
                .sorted(Comparator.comparingInt(CharPosition::pos))
                .toList();

        int wordLen = charPositions.get(charPositions.size() - 1).pos() + 1;

        String[] word = new String[wordLen];

        charPositions.forEach(c -> word[c.pos()] = c.ch());

        String result = Arrays.stream(word)
                .map(str -> Objects.requireNonNullElse(str, " "))
                .collect(Collectors.joining());

        System.out.println(result);
    }

    public static void main(String[] args) {
        charsIndex();
        charsToString();
    }
}

3. 创建字符数组并填充

创建一个足够长的字符串数组,长度为最大索引值加 1。然后,遍历 CharPosition 列表,将字符放置到数组中对应的位置。

Powtoon
Powtoon

AI创建令人惊叹的动画短片及简报

下载

4. 处理空格

由于原始字符串中可能包含空格,我们需要在数组中将没有字符的位置填充为空格。可以使用 Objects.requireNonNullElse 方法,将数组中的 null 值替换为空格。

5. 使用 Collectors.joining() 重建字符串

最后,使用 Collectors.joining() 方法将数组中的字符连接起来,生成最终的字符串。

完整代码示例:

import java.util.*;
import java.util.stream.Collectors;
import java.util.Arrays;
import java.util.Objects;

public class StringReconstruction {

    private static final String text = "Hello Word!";
    static Map> charsIndex = new HashMap<>();

    static void charsIndex() {

        List charsList = text
                .chars()
                .mapToObj(e -> (char) e)
                .toList();
        System.out.println(charsList);

        int  position = 0;
        for (Character c : charsList) {
            if(!c.toString().isBlank()){
                charsIndex.computeIfAbsent(c.toString(),
                        addCharPosition -> new ArrayList<>()).add(position);
            }
            position += 1;
        }

        System.out.println(charsIndex);
    }

    public record CharPosition(String ch, int pos) {}

    static void charsToString() {

        List charPositions = charsIndex.entrySet().stream()
                .flatMap(entry -> entry.getValue().stream()
                        .map(pos -> new CharPosition(entry.getKey(), pos))
                )
                .sorted(Comparator.comparingInt(CharPosition::pos))
                .toList();

        int wordLen = charPositions.get(charPositions.size() - 1).pos() + 1;

        String[] word = new String[wordLen];

        charPositions.forEach(c -> word[c.pos()] = c.ch());

        String result = Arrays.stream(word)
                .map(str -> Objects.requireNonNullElse(str, " "))
                .collect(Collectors.joining());

        System.out.println(result);
    }

    public static void main(String[] args) {
        charsIndex();
        charsToString();
    }
}

注意事项:

  • 确保字符位置索引的正确性,错误的索引会导致重建的字符串出现偏差。
  • Objects.requireNonNullElse 方法用于处理可能存在的 null 值,避免 NullPointerException。
  • Collectors.joining() 方法提供了灵活的字符串连接方式,可以自定义分隔符。

总结:

通过使用 Java 集合和流 API,我们可以有效地利用字符及其位置信息重建字符串。这种方法不仅简洁高效,而且易于理解和维护。通过定义辅助类型 CharPosition,排序字符位置,处理空格以及使用 Collectors.joining() 方法,我们可以轻松地实现字符串的重建。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

843

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

742

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

740

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

400

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

431

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.8万人学习

C# 教程
C# 教程

共94课时 | 7.3万人学习

Java 教程
Java 教程

共578课时 | 49.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号