【问题标题】:Assigning each character within a String a new set of characters为字符串中的每个字符分配一组新字符
【发布时间】:2015-03-25 14:59:00
【问题描述】:

我正在尝试在我的 Android 应用程序中添加一个功能,允许用户输入一些文本,比如说 “testing”,当他们点击一个按钮时,程序会读取文本,将其转换为一个字符串,然后为每个字符分配一个新值并在屏幕上显示这些值。例如对于 "testing",程序会将其更改为 "t e s t i n g"。然后它需要改变字符的值,所以 “t e s t i n g” 可能会变成 "ta ea sa ta i a na ga"

所以基本上我需要:

  1. 将原始字符串分解成单独的字符
  2. 将所有单个字符的值更改为新值(例如:a = abc、b = bcd、c = wxy)
  3. 在屏幕上的 TextView 中显示新值。

如果您需要有关我的问题的更多信息,请随时在评论中提问。非常感谢所有帮助!

编辑: 下面是我将实际使用的代码的一个小例子

"a" = "o9Q5QD8gT8"
“A”=“x5h10vc4jd15”
"1" = "S7J11IH4yK16"

我的代码类似于所有字母 (a-z) 大写和小写、所有数字 (0-9) 和所有额外字符的代码

【问题讨论】:

  • 对不起,我忘了说我正在使用 android,所有这些都需要在按钮的 OnClick 内发生。
  • 你已经有了算法。编码的时候有遇到什么困难吗?如果是这样,请在问题中包含您所做的事情。
  • 你是如何尝试实现的,你遇到了什么错误?
  • 仍然看不到您的代码
  • 我尝试过简单地使用“string.replace”,但是由于多种原因这不起作用。我也尝试将字符串转换为 charArray 但是我对数组没有太多了解并且找不到任何运行良好以通过 Eclipse 错误检查的代码

标签: java android string char encode


【解决方案1】:

这行得通:

import java.util.*;

public class Translator {

    private static final Map<Character, String> translations = new HashMap<>();
    static {
        translations.put('a', "o9Q5QD8gT8");
        translations.put('A', "x5h10vc4jd15");
        translations.put('1', "S7J11IH4yK16");
    }

    public static void main(final String[] args) {
        System.out.println(translate("abcABC123"));
    }

    private static String translate(final String input) {
        final StringBuilder sb = new StringBuilder();
        for (final char c : input.toCharArray()) {
            sb.append(translate(c));
        }
        return sb.toString();
    }

    private static String translate(final char c) {
        String translation = translations.get(c);
        if (translation == null) {
            translation = Character.toString(c);
        }
        return translation;
    }
}

输出:

o9Q5QD8gT8bcx5h10vc4jd15BCS7J11IH4yK1623

此解决方案遍历输入字符串的字符并在静态 Map 中查找它们。如果字符作为 Map 中的键出现,则关联的值用作翻译值,否则使用原始字符。 StringBuider 用于按顺序附加翻译值。

请注意,使用这样的静态地图通常不是一个好的长期解决方案。 Map 中的键和值可能需要在某处进行管理,例如在数据库或属性文件中。

编辑:从属性文件读取的修改版本。

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Translator {

    private static final String PROPERTIES_FILE_NAME = "translations.properties";
    private final Properties translations = new Properties();

    public Translator() {
        // Below is the try-with-resources syntax, available since 1.7
        // See: http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
        try (InputStream input = Translator.class.getResourceAsStream(PROPERTIES_FILE_NAME)) {
            System.out.println(input);
            translations.load(input);
        } catch (final IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(final String[] args) {
        final Translator translator = new Translator();
        System.out.println(translator.translate("abcABC123"));
    }

    private String translate(final String input) {
        final StringBuilder sb = new StringBuilder();
        for (final char c : input.toCharArray()) {
            sb.append(translate(c));
        }
        return sb.toString();
    }

    private String translate(final char c) {
        String translation = translations.getProperty(String.valueOf(c));
        if (translation == null) {
            translation = Character.toString(c);
        }
        return translation;
    }
}

使用以下内容创建一个文件“translations.properties”,并确保它位于类路径中。

a=o9Q5QD8gT8
A=x5h10vc4jd15
1=S7J11IH4yK16

【讨论】:

  • 谢谢@AdriaanKoster !!这完美!你建议我应该把我的键和值放在一个单独的地方,我同意,因为我将有 95 对不同的字符和它们的新值。你对我将在哪里/如何做这件事有建议吗?
【解决方案2】:
    Hi i think this may work.


       class Stack {
public static void main(String args[])
{
    String character="testing";
    for(int i=0;i<character.length();i++)
    {
        char a=character.charAt(i);
        switch(a)
        {
        case 't':System.out.print(a+"a");
        break;
        case 'e':System.out.print(a+"a");
        break;
        case 's':System.out.print(a+"a");
        break;
        case 'i':System.out.print(a+"a");
        break;
        case 'n':System.out.print(a+"a");
        break;
        case 'g':System.out.print(a+"a");
        break;
        default:System.out.print("OUT");
            break;
        }
    }
}

}

【讨论】:

  • 这不是一个正确或优雅的解决方案 IMO,因为:它使用 switch 语句,使用 System.out.print 并为任何无法识别的字符输出“OUT”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 2016-07-31
  • 2019-01-12
  • 1970-01-01
相关资源
最近更新 更多