Java实现字符串自动补齐

引言

在开发过程中,经常会遇到需要对字符串进行自动补齐的场景,比如在搜索时,输入关键字后,系统会自动提示可能的补全结果。本文将介绍如何使用Java实现字符串的自动补齐功能。首先,我们将整个过程分为几个步骤,然后逐步介绍每个步骤的具体实现。

过程概述

整个过程可以分为以下几个步骤:

  1. 构建数据结构:构建一个数据结构,用于保存所有可能的补全结果。
  2. 加载数据:从外部数据源加载数据,并将其保存到数据结构中。
  3. 实现自动补齐功能:根据用户输入的前缀,从数据结构中查找匹配的结果,并返回给用户。

下面我们将逐步介绍每个步骤的具体实现。

构建数据结构

在这个步骤中,我们需要构建一个数据结构,用于保存所有可能的补全结果。在Java中,我们可以使用Trie树(字典树)来实现。Trie树是一种树形数据结构,用于高效地存储和搜索字符串集合。

class TrieNode {
    boolean isWord;
    Map<Character, TrieNode> children;

    public TrieNode() {
        isWord = false;
        children = new HashMap<>();
    }
}

class Trie {
    TrieNode root;

    public Trie() {
        root = new TrieNode();
    }

    public void insert(String word) {
        TrieNode node = root;
        for (char c : word.toCharArray()) {
            if (!node.children.containsKey(c)) {
                node.children.put(c, new TrieNode());
            }
            node = node.children.get(c);
        }
        node.isWord = true;
    }

    public boolean search(String word) {
        TrieNode node = find(word);
        return node != null && node.isWord;
    }

    public boolean startsWith(String prefix) {
        TrieNode node = find(prefix);
        return node != null;
    }

    private TrieNode find(String prefix) {
        TrieNode node = root;
        for (char c : prefix.toCharArray()) {
            if (!node.children.containsKey(c)) {
                return null;
            }
            node = node.children.get(c);
        }
        return node;
    }
}

上述代码定义了两个类,TrieNode表示字典树中的一个节点,包含一个用于标识是否为单词结尾的布尔值isWord和一个用于存储子节点的MapTrie类表示整个字典树,包含一个根节点root和相应的插入、搜索和前缀匹配的操作方法。

加载数据

在这个步骤中,我们需要从外部数据源加载数据,并将其保存到数据结构中。这里以加载一个字符串数组为例。

String[] data = {"apple", "banana", "orange", "pear"};

Trie trie = new Trie();
for (String word : data) {
    trie.insert(word);
}

上述代码中,我们定义了一个字符串数组data,并使用Trie类将其中的每个单词插入到字典树中。

实现自动补齐功能

在这个步骤中,我们需要根据用户输入的前缀,从数据结构中查找匹配的结果,并返回给用户。下面我们将通过一个简单的控制台程序来演示实现过程。

import java.util.List;
import java.util.Scanner;

public class AutoComplete {
    public static void main(String[] args) {
        String[] data = {"apple", "banana", "orange", "pear"};

        Trie trie = new Trie();
        for (String word : data) {
            trie.insert(word);
        }

        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter a prefix: ");
        String prefix = scanner.nextLine();

        List<String> results = autoComplete(trie, prefix);
        System.out.println("Auto complete results:");
        for (String result : results) {
            System.out.println(result);
        }
    }

    public static List<String> autoComplete(Trie trie, String prefix) {
        List<String> results = new ArrayList<>();
        TrieNode node = trie.find(prefix);
        if (node != null) {
            StringBuilder sb = new StringBuilder(prefix);
            autoCompleteHelper(node, sb, results);
        }
        return results;