在Java中将固定大小的数组添加到List中

时间:2014-05-01 19:41:35

标签: java arrays string set

如何将String []添加到Set避免异常中。 我把数组的大小设置为100,它不需要是固定大小的数组 我需要访问数组的成员,如x [],所以我可以插入数组值。

Set<String[]> s = new TreeSet<String[]>();
String[] x = new String[100];
int i=0;
x[i++] = ...
x[i++] = ...
s.add(x);



Ljava.lang.String; cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1188)
at java.util.TreeMap.put(TreeMap.java:531)
at java.util.TreeSet.add(TreeSet.java:255)  

1 个答案:

答案 0 :(得分:3)

Arrays没有&#34;自然顺序&#34;,这就是你得到这个例外的原因。

一种方法是在构建TreeSet时提供自定义比较器。

Set<String[]> s = new TreeSet<String[]>(new Comparator<String[]>() {    
        @Override
        public int compare(String[] o1, String[] o2) {
             //your logic here
        }
    });

但我认为您不应该使用TreeSet来处理这类事情,因为很难说明如何定义比较数组的订单。

IMO你最好的选择是创建一个包装类,重写hashcode和equals并将它们放在HashSet中。

class WrapperStringArray {
    private String[] arr;

    //constructors, getters, setter and additional methods

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + Arrays.hashCode(arr);
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        WrapperStringArray other = (WrapperStringArray) obj;
        return Arrays.equals(arr, other.arr);
    }   
}