如何ele根據freq陣列對陣列進行排序?
public class Comparator1 {
public static void main(String[] args) {
char[] ele = { 'a', 'b', 'c', 'd', 'e' };
int[] freq = { 5, 4, 3, 2, 1 };
System.out.println(Arrays.toString(ele));
}
}
uj5u.com熱心網友回復:
如果freq陣列中沒有重復,則可以使用TreeMap:
public static char[] sort(char[] ele, int[] freq) {
Map<Integer, Character> map = new TreeMap<>();
for (int i = 0; i < ele.length; i )
map.put(freq[i], ele[i]);
int i = 0;
for (Character ch : map.values())
ele[i ] = ch;
return ele;
}
否則,您可以使用PriorityQueue:
public static char[] sort(char[] ele, int[] freq) {
class Pair {
final char ele;
final int freq;
public Pair(char ele, int freq) {
this.ele = ele;
this.freq = freq;
}
}
Queue<Pair> queue = new PriorityQueue<>(Comparator.comparingInt(pair -> pair.freq));
for (int i = 0; i < ele.length; i )
queue.add(new Pair(ele[i], freq[i]));
int i = 0;
for (Pair pair : queue)
ele[i ] = pair.ele;
return ele;
}
uj5u.com熱心網友回復:
將其轉換為地圖可以更好地幫助您,因為您可以輕松地對地圖進行排序。試試下面的代碼
char ele[] = new char[] { 'a', 'b', 'c', 'd', 'e' };
int freq[] = new int[] { 5, 4, 7, 2, 1 };
int n=ele.length;
//this will check whether both have same element or not
if(n!=freq.length)
return;
Map<Character,Integer> unsorted=new HashMap<>();
//this will merge your both array into single map with key as char and freq as value
for(int i=0;i<n;i )
{
unsorted.put(ele[i],freq[i]);
}
Map<Character, Integer> sorted = new LinkedHashMap<>();
unsorted.entrySet().stream()
.sorted(Map.Entry.<Character, Integer>comparingByValue().reversed())
.forEachOrdered(x -> sorted.put(x.getKey(), x.getValue()));
sorted.forEach((k,v)->
{
System.out.println(k " --> " v);
});
uj5u.com熱心網友回復:
你肯定需要更具體。當從 char 轉換時,您是否想根據 int 陣列的相應有序整數對 char 陣列進行排序?例如, [ 'a', 'd', 'b', 'c', 'e' ] 和 [ 3, 1, 2, 5, 4 ] 變成 [ 'c', 'a', 'b', 'e','d']?或者 int 陣列中的整數應該代表 char 陣列的索引?例如,給定最后一個實體的相同陣列,我們現在的輸出為 [ 'd', 'b', 'a', 'e', 'c' ]。這個問題需要更多的背景關系。
無論如何,我已經提出了兩個簡單而優雅的解決方案來解決這兩種情況。它們很簡單,因為它們避免了任何復雜的資料結構,如 HashMaps 或 TreeMaps,而只使用陣列。享受 :)
情況1
char ele[] = new char[] { 'a', 'd', 'b', 'c', 'e' };
int freq[] = new int[] { 3, 1, 2, 5, 4 };
Arrays.sort(ele);
char sortedEle[] = new char[ele.length];
int idxCounter = 0;
for (int i = 0; i < freq.length; i ) {
for (int j = 0; j < ele.length; j ) {
if (freq[i] == j 1) {
sortedEle[idxCounter] = ele[j];
idxCounter ;
}
}
}
System.out.println(Arrays.toString(sortedEle));
案例二
char ele[] = new char[] { 'a', 'd', 'b', 'c', 'e' };
int freq[] = new int[] { 3, 1, 2, 5, 4 };
char sortedEle[] = new char[ele.length];
for (int i = 0; i < ele.length; i ) {
int idx = freq[i] - 1;
sortedEle[idx] = ele[i];
}
System.out.println(Arrays.toString(sortedEle));
uj5u.com熱心網友回復:
我希望這適用于兩種排序方式
public static void main(String[] args) {
char ele[] = new char[]{'a', 'b', 'c', 'd', 'e'};
int freq[] = new int[]{5, 4, 3, 2, 1};
Map<Character, Integer> inputMap = new HashMap<>();
for (int i = 0; i < ele.length; i ) {
inputMap.put(ele[i],freq[i]);
}
System.out.println(inputMap);
// sort in desc
Map<Character, Integer> sortedDesc = new LinkedHashMap<>();
inputMap.entrySet().stream()
.sorted(Map.Entry.<Character, Integer>comparingByValue().reversed())
.forEachOrdered(x -> sortedDesc.put(x.getKey(), x.getValue()));
System.out.println(sortedDesc);
System.out.println(sortedDesc.keySet());
// sort in asc
LinkedHashMap<Character, Integer> sortedAsc = new LinkedHashMap<>();
inputMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.forEachOrdered(x -> sortedAsc.put(x.getKey(), x.getValue()));
System.out.println(sortedAsc);
System.out.println(sortedAsc.keySet());
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392755.html
上一篇:鏈接哈希映射計數器未正確遞增
