插個東西,今天先不寫mr,下午再寫,剛剛搞了一個問題,覺得自己真是學了不少,長見識了,之前隻知道數組和集合之間可以互相轉換,今天寫mr的時候,有一個功能是要求列出三個數組中的共同元素,于是我很 xx 的寫下了三層for循環:
String[] s1 = {"a","b","c","d"};
String[] s2 = {"b","c","d","e"};
String[] s3 = {"c","d","e","f"};
if(s1 != null && s2 != null && s3 != null){
List<String> arrayList = new ArrayList<String>();
for (int i = 0; i < s1.length; i++) {
for (int j = 0; j < s2.length; j++) {
for (int k = 0; k < s3.length; k++) {
if(s1[i].equals(s2[j]) && s2[j].equals(s3[k])){
arrayList.add(s3[k]);
}
}
}
}
System.out.println(arrayList.toString());
}
這樣寫完肯定是不行的,之後開始優化一下:
if(s1 != null && s2 != null && s3 != null){
List<String> arraylist = new ArrayList<>();
for (int i = 0; i < s1.length; i++) {
for (int j = 0; j < s2.length; j++) {
if(s1[i].equals(s2[j])){
for (int k = 0; k < s3.length; k++) {
if(s2[j].equals(s3[k])){
arraylist.add(s3[k]);
}
}
}
}
}
System.out.println(arrayList.toString());
}
這樣寫完的确是減少一些循環的次數,但是為了讓代碼看着簡潔,于是我就想着要不先轉換成集合,然後集合裡面的方法多,可以找找看有沒有合适的,于是找到了,retainAll可以留下共同的元素,就算不能想StringBuilder級聯使用,就算底層也是for循環,但外面看着是好看些,于是我開始把數組轉換成集合,于是乎。。。
List<String> list1 = Arrays.asList(s1);
List<String> list2 = Arrays.asList(s2);
List<String> list3 = Arrays.asList(s3);
list1.retainAll(list2);
list1.retainAll(list3);
于是我就開始碰見這個問題了,“Exception in thread "main" java.lang.UnsupportedOperationException” 提示我沒這操作,我好像也沒寫錯什麼啊,就這麼簡單的兩句話,我好像真的沒有寫錯什麼啊,然後我就開始看retainAll這個方法,我調用的也對啊。。。
最後問了大神歐巴又度娘了,才知道不是方法的問題而是asList傳回的是固定長度的數組,源碼裡也寫了是個fixed-array,既然是固定肯定是不能添加删除的,隻能用一些數組之前的操作,然後我就寫了下面的方法,也提醒自己集合裡面的方法好多不用自己都忘記了,還是要經常溫故而知新的。
List<String> list1 = Arrays.asList(s1);
list1 = new ArrayList<>(list1);
List<String> list2 = Arrays.asList(s2);
list2 = new ArrayList<>(list2);
List<String> list3 = Arrays.asList(s3);
list3 = new ArrayList<>(list3);
list1.retainAll(list2);
list1.retainAll(list3);
這樣就可以得到三個數組共有的元素了,這樣寫表面上是簡潔了很多,但是底層仍然是for循環,是以都一樣的,并且retainAll這個方法還要注意,會删除掉所有不同的元素,原集合會發生改變,這也是有一定代價的。
PS:我看别的部落格也有使用ArrayUtils.toObject(T[] t)這個方法的,但是對于字元串行不通,而且還要Apache-common下面的包,反正我在hadoop上是能找到這個方法。
另外:
也寫一下集合轉換成數組的方法:
T[] t = new T[集合實作類.size()];
集合實作類.toArray(T[] t);