问题描述
我是Java的初学者,但遇到了问题。问题说:
给出n个实数字符串的数组s,以降序对其进行排序-但是,等等,还有更多!每个数字的打印格式必须与从stdin读取的格式完全相同,这意味着.1打印为.1,0.1打印为0.1。如果两个数字代表数值上相等的值(例如),则必须按照接收到它们作为输入的相同顺序列出它们。
我编写了以下代码:
'public static void main(String []args){
//Input
Scanner sc= new Scanner(system.in);
int n=sc.nextInt();
String []s=new String[n+2];
for(int i=0;i<n;i++){
s[i]=sc.next();
}
sc.close();
//TypeCasting
BigDecimal[] deci = new BigDecimal[n];
for(int i=0;i<n;i++){
deci[i] =new BigDecimal(s[i]);
}
//Write your code here//SelectionSort
for(int i =0; i<n-1; i++){
for(int j=i; j<n; j++){
int minIndex = i;
if(deci[j].compareto(deci[minIndex])>0){
minIndex = j;
}
BigDecimal temp = deci[i];
deci[i] = deci[minIndex];
deci[minIndex] = temp;
}
}
for(int i=0;i<n;i++){
s[i] = (deci[i]).toString();
}
//Output
for(int i=0;i<n;i++)
{
System.out.println(s[i]);
}
}`
Sample Input: 9 -100 50 0 56.6 90 0.12 .12 02.34 000.000
Sample Output: 90 56.6 50 02.34 0.12 .12 0 000.000 -100
My Output: 90 56.6 50 2.34 0.12 0.12 0 0.000 -100
请帮助我如何打印与我上面使用的“选择排序”完全相同的格式。
解决方法
您可以与String[] s
同时对BigDecimal[] deci
进行排序。这样一来,您就可以输出以System.in
形式读取的原始字符串,而不必以某种方式将BigDecimal
对象转换回其原始字符串。
您应该注意,您的代码确实实现了选择排序,但是没有实现稳定选择排序。也就是说,“如果两个数字代表数值上相等的值(例如),则必须按照接收到它们作为输入的相同顺序列出它们。”
例如:
Sample Input: 6 .1 1 0.1 10 00.1 2
Expected Output: 10 2 1 .1 0.1 00.1
Your Output: 10 2 1 .1 00.1 0.1
可以通过以下两种方法之一实现稳定的选择排序:使用数组,然后在其索引处插入下一个值,然后移动其余元素。或者使用LinkedList
并将下一个值添加到未排序部分的开头。
这是 insert and shift 方法的实现。我只是向左交换deci[]
个元素,直到它们在正确的索引中为止,而不是插入并向右移动。
static String[] selectionSortStable(BigDecimal[] deci,String[] s,int n) {
//Write your code here //SelectionSort
for(int i = 0; i < n - 1; i++) {
for(int j = i + 1; j < n; j++) {
int minIndex = i;
if(deci[j].compareTo(deci[minIndex]) >= 0) {
minIndex = j;
} else {
continue; // don't need to swap already sorted elements
}
// in order to ensure a stable sort,we need to swap unsorted
// elements until deci[minIndex] is in deci[i]
for(int k = minIndex; k > i; k--) {
BigDecimal bdtmp = deci[k];
deci[k] = deci[k - 1];
deci[k - 1] = bdtmp;
// sort the array of string representations at the same time
String stmp = s[k];
s[k] = s[k - 1];
s[k - 1] = stmp;
}
}
}
return s;
}
public static void main(String[] args) {
//Input
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] s = new String[n+2];
for(int i = 0; i < n; i++) {
s[i] = sc.next();
}
sc.close();
//TypeCasting
BigDecimal[] deci = new BigDecimal[n];
for(int i = 0; i < n; i++) {
deci[i] = new BigDecimal(s[i]);
}
s = selectionSortStable(deci,s,n);
// now just output the sorted string array 's'
for(int i = 0; i < n; i++) {
System.out.print(s[i] + " ");
}
System.out.println();
}
,
public static void main(String[] args) {
class Data {
int order;
double value;
String str;
}
try (Scanner scan = new Scanner(System.in)) {
scan.useLocale(Locale.ENGLISH);
Comparator<Data> sortByValueDescThenByOrderAsc = (one,two) -> {
int res = Double.compare(two.value,one.value);
return res == 0 ? Integer.compare(one.order,two.order) : res;
};
String[] nums = scan.nextLine().split("\\s+");
List<Data> res = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
Data data = new Data();
data.str = nums[i];
data.order = i;
data.value = Double.parseDouble(data.str);
res.add(data);
}
res.sort(sortByValueDescThenByOrderAsc);
System.out.println(res.stream().map(data -> data.str).collect(Collectors.joining(" ")));
}
}