Java 按不区分大小写的元素查找列表中的原始元素

Java 按不区分大小写的元素查找列表中的原始元素,java,list,data-structures,java-8,Java,List,Data Structures,Java 8,列表具有以下值: Aa Bb CC 我想通过发送不区分大小写的值来获取原始值。 范例 java 8流解决方案也很受欢迎IMHO您将需要一张地图来实现这一神奇的功能,例如: static List<String> list; static Map<String, String> map = new HashMap<>(); /** * Launch the application. */ public static void main(String[]

列表具有以下值:

Aa
Bb
CC
我想通过发送不区分大小写的值来获取原始值。 范例

java 8流解决方案也很受欢迎

IMHO您将需要一张地图来实现这一神奇的功能,例如:

static List<String> list;
static Map<String, String> map = new HashMap<>();

/**
 * Launch the application.
 */
public static void main(String[] args) {
    add("Aa");
    add("Bb");
    add("CC");

    //should return Aa
    String originalValue = getOriginalElement("aa");

    //should return Bb
    originalValue = getOriginalElement("BB");

    //should return CC
    originalValue = getOriginalElement("cc");
}

static public void add(String element){
    list.add(element);
    map.put(element.toLowerCase(), element);
}

static public String getOriginalElement(String caseInsensitiveStr){
    return map.get(caseInsensitiveStr.toLowerCase());
}

如果您有额外的内存,请添加一些键值存储甚至HashMap,其中key是小写字符串,value是原始字符串。

使用Java 8 streams的解决方案:

static public String getOriginalElement(String caseInsensitiveStr){
    return list.stream().filter(
        x -> caseInsensitiveStr.equalsIgnoreCase(x)).findFirst().get();
}

@Eugene,同意直截了当的解决方案,但对于大名单来说,这会很慢。如果没有其他方法,我会使用它。谈到同等信号案例,顺便说一句,你是否测量过这一点以获得确认?请在发布之前修复你的代码。由于各种原因,这不起作用。你也应该先自己试试。这里有一些提示:1。初始化你的列表,2。您需要将列表传递给GetOriginaleElement方法3。contains+toUppercase或stream可以使用。为什么这篇文章没有得到你尝试过的经典内容before@VextoR如果您担心它是打开的,请使用地图。列表是无用的。@yudongshen在第一种情况下是的,但由于其他原因它可能是必要的。我不同意您需要地图。这个问题没有说明性能。如果更多地了解有关运行时行为与内存占用的要求,例如,可以进行优化。在不了解需求的情况下进行优化会导致代码不易理解,从而导致代码不易维护。@LarsGendner这是一个很好的观点,但我已经发布了这两个选项。但是你的措辞说你需要一个地图。我同意,您后来添加的流解决方案与您的第一句话相矛盾。
static public String getOriginalElement(String caseInsensitiveStr){
    return list.stream().filter(s -> s.equalsIgnoreCase(caseInsensitiveStr)).findFirst().get();
}
static public String getOriginalElement(String caseInsensitiveStr){
    return list.stream().filter(
        x -> caseInsensitiveStr.equalsIgnoreCase(x)).findFirst().get();
}