【问题标题】:Finding original element in the list by case insensitive element通过不区分大小写的元素在列表中查找原始元素
【发布时间】:2018-01-26 13:21:25
【问题描述】:

列表有值:

Aa
Bb
CC

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

public class TEST {

    static List<String> list;

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

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

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

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

    static public String getOriginalElement(String caseInsensitiveStr){
        String magic ="";
        // magic happens here
        // magic = 
        return magic;
    }
}

java 8 流解决方案也受欢迎

【问题讨论】:

  • @Eugene,同意作为直接的解决方案,但对于大型列表来说会很慢。如果没有其他方法会使用它。 (谈equalsIgnoreCase)
  • 你是否测量了这个以得到肯定?
  • 请在发布之前修复您的代码。由于各种原因,这无法正常工作。你也应该先自己尝试一下。这里有一些提示:1. 初始化您的列表,2. 您需要将您的列表传递给您的 getOriginalElement 方法,3. 可以使用包含 + toUppercase 或流
  • 这篇博文怎么也没有经典的你以前试过什么
  • @VextoR 如果您担心它是 O(n),请使用地图

标签: java list data-structures java-8


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用 Java 8 流的解决方案:

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

    【讨论】:

      【解决方案3】:

      恕我直言,你需要一个map 来做到这一点魔法像这样:

      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());
      }
      

      如果你只想要一个没有额外地图的“神奇”代码:

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

      【讨论】:

      • 这个列表没用。
      • @yudongshen 在第一种情况下是的,但由于其他原因可能是必要的。
      • 我不同意您需要地图。这个问题没有说明性能。如果更多地了解有关运行时行为与内存占用(例如)的要求,则可以进行优化。在不了解需求的情况下进行优化会导致代码的可理解性降低,从而导致代码的可维护性降低。
      • @LarsGendner 这是一个很好的观点,但我已经发布了两个选项。
      • 但是你的措辞说“你需要一张地图”。您之后添加的流解决方案与您的第一句话相矛盾,我同意。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多