3 回答

TA貢獻1818條經驗 獲得超7個贊
只需Collections.sort(temp);在最后一個 for 循環中包含這個,這是必要的,因為多個數字可以具有相同的 digitRoot 并且應該放在已排序的列表中。
for (int i=0;i<a.length;i++) {
ArrayList<Integer> temp = map.get(a1[i]);
Collections.sort(temp);
for(int j=0;j<temp.size();j++) {
a[i]=temp.get(j);
if (j<temp.size()-1)
i++;
}
}
Input: a: [13, 20, 7, 4]
Output: [20, 4, 13, 7]
編輯:關于錯誤
因為在put(a1[i], Collections.sort(list))put 方法中是期望的put(int, List),但是你給了它put(int, void),因為返回類型Collections.sort()是void,你只需要先對列表進行排序然后再通過

TA貢獻1876條經驗 獲得超7個贊
您似乎正在嘗試插入集合的排序值。Collections.sort(List)
,無論好壞,就地對該列表進行排序并且不返回任何內容。先對列表進行排序,然后將其插入到地圖中。

TA貢獻1868條經驗 獲得超4個贊
放入地圖時不需要對數組進行排序。相反,您可以在最后一個循環中檢索時對其進行排序:
Arrays.sort(a1);
for (int i=0;i<a.length;i++) {
ArrayList<Integer> temp = map.get(a1[i]);
Collections.sort(temp);
for(int j=0;j<temp.size();j++) {
a[i]=temp.get(j);
if (j<temp.size()-1)
i++;
}
}
如果您需要在放入地圖時進行排序,您應該使用 SortedSet 因為它會自動保持元素排序:
int[] digitRootSort(int[] a) {
HashMap<Integer, TreeSet<Integer>> map = new HashMap<Integer, TreeSet<Integer>>();
int[] a1 = new int[a.length];
for (int i = 0; i < a.length; i++) {
a1[i] = digitRoot(a[i]);
if (map.containsKey(a1[i])) {
TreeSet<Integer> set = map.get(a1[i]);
set.add(a[i]);
map.put(a1[i], set);
} else {
TreeSet<Integer> set = new TreeSet<Integer>();
set.add(a[i]);
map.put(a1[i], set);
}
}
Arrays.sort(a1);
for (int i = 0; i < a.length;) {
TreeSet<Integer> set = map.get(a1[i]);
for (int j : set) {
a[i] = j;
i++;
}
}
return a;
}
但是,通過使用適當的比較器,還有一種更簡單的方法來處理排序集:
int[] digitRootSort(int[] a) {
SortedSet<Integer> set = new TreeSet<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
int result = Integer.compare(digitRoot(a), digitRoot(b));
result = result == 0 ? Integer.compare(a, b) : result;
return result;
}
});
for (int i : a) {
set.add(i);
}
int i = 0;
for (int j : set) {
a[i++] = j;
}
return a;
}
添加回答
舉報