繁体   English   中英

转换列表 <String> 设置为CASE INSENSITIVE Manner-Java 6

[英]convert List<String> to Set in CASE INSENSITIVE Manner-Java 6

我有一个列表,其中包含字符串ABC:123,abc:123;当我将它转换为设置它给我2个不同的元素。有一个单行方式将此列表转换为设置忽略大小写,以便我的集合包含ABC只有123.但是如果输入List包含ABC:123a4,abc:1234A4它应该在Set中给我2个不同的元素:ABC:123a4,ABC:1234A4我知道这可以在“:”上拆分列表元素首先将abc转换为全部大写,然后将它们添加到新列表中,然后将其添加到新列表中。但是只是想知道是否有更好的方法(小行代码)来做到这一点。感谢任何大脑提前思考的想法。

List<String> memlist = new ArrayList<String>(Arrays.asList(memberList.split(",")));
Set<String> memberSet = new HashSet<String>(memlist );
memlist = new ArrayList<String>(memberSet);

您可以使用TreeSet并设置String.CASE_INSENSITIVE_ORDER标志。

    String startingString = "ABC:123,abc:123";
    List<String> caseSensitiveList = Arrays.asList(startingString.split(","));
    Set<String> caseInsensitiveSet = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
    caseInsensitiveSet.addAll(caseSensitiveList);

    for(String caseInsensitiveString : caseInsensitiveSet){
        System.out.println(caseInsensitiveString);
    }

这段代码在运行时给出了输出:

ABC:123

更换

memberList.split(",")

memberList.toUpperCase().split(",")

最干净的解决方案是@SQLHacks建议的解决方案。 但是你说ABC:123a4必须与abc:1234A4不同。 我想现在唯一的解决方案是为String对象创建一个包装器并覆盖equals()hashCode()方法来做你想要的,就像@PaulBoddington在他的评论中所建议的那样。


这就是我提出的(基于@nafas答案编辑和改进):

public class StringWrapper {

    private String value;

    private String beforeColon;
    private String afterColon;

    private int hash;

    public StringWrapper(String value) {
        this.value = value;

        String[] splitted = value.split(":");
        beforeColon = splitted[0];
        afterColon = splitted[1];
        hash = Objects.hash(beforeColon.toUpperCase(), afterColon);
    }

    public String getValue() {
        return value;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof StringWrapper) {
            StringWrapper other = (StringWrapper) obj;
            return beforeColon.equalsIgnoreCase(other.beforeColon) && afterColon.equals(other.afterColon);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return hash;
    }

    @Override
    public String toString() {
        return value;
    }

}

接着:

    // this method is just to help you building a List<StringWrapper> from your String (memberList variable)
    public static List<StringWrapper> split(String string, String regex) {
        List<StringWrapper> list = new ArrayList<>();
        for (String element : string.split(regex)) {
            list.add(new StringWrapper(element));
        }
        return list;
    }

    public static void main(String[] args) {
        String memberList = "ABC:123,abc:123,ABC:123a4,ABC:123A4";

        List<StringWrapper> memlist = new ArrayList<>(split(memberList, ","));
        Set<StringWrapper> memberSet = new HashSet<>(memlist);
        memlist = new ArrayList<StringWrapper>(memberSet);

        for (StringWrapper element : memlist) {
            System.out.println(element);
        }
    }

如果你运行它,你得到以下输出:

ABC:123a4
ABC:123A4
ABC:123

abc:123已经出局但是ABC:123a4ABC:123A4都存在。

您可以更轻松地更改静态split方法以便为您创建Set 我没有这样做的原因是让你看起来很熟悉。

你可以试试这个Java 8 one liner

Set<String> memberSet = memlist.stream().map(s -> s.toUpperCase()).collect(Collectors.toSet());

它将遍历memlist中的所有字符串,将它们转换为大写并将它们放到一个集合中。

这当然意味着如果你的列表包含“abc:123”但不包含“ABC:123”,你仍然会在集合中获得“ABC:123”。

实际创建一个小型Model类以处理所有可能的情况有什么问题?

final class Model{
 final String firstPart;
 final String secondPart;
 final int hashCode;
  Model(String s){
   String[] splitted=s.split(":");
   firstPart=splitted[0];
   secondPart=splitted[1];
   hashCode=Objects.hash(firstPart.toLowerCase(),secondPart);

  }

  @Override
  public boolean equals(Object o){
   String[] splitted=o.toString().split(":");
   return firstPart.equalsIgnoreCase(splitted[0]) && secondPard.equals(splitted[1]);
  }

  @Override
  public int hashCode(){
   return hashCode;
  }

  @Override
  public String toString(){
    return firstPart+":"+secondPart;
  }
}

现在创建一个集合等:

Set<Model> set =new HashSet<Model>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM