2016-09-09 1 views
-1

値が等しい数の順序をmaintainigながらそれらをソートする。並べ替え、文字列から解析されたのBigDecimalのリストIは、様々な形式</p> <p>IがのBigDecimalにこれらの番号を解析してるの番号を表す文字列のリストで読み取らい

その後、番号を元の形式に戻して印刷します。

問題は、現在のコードでは発生していない、等しい数値の順序を維持する必要があることです。

import java.math.BigDecimal; 
import java.util.*; 
class Solution{ 

    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(); for (int i = 0; i < n -1; i++) { 
      for (int k = (i + 1); k < n; k++) { 
       if (new BigDecimal(s[i]).compareTo(new BigDecimal(s[k])) < 0) { 
        String tempValue = s[i]; 
        s[i] = s[k]; 
        s[k] = tempValue; 
       } 
      } 
     } 

入力

9 
-100 
50 
0 
56.6 
90 
0.12 
.12 
02.34 
000.000 

出力

90 
56.6 
50 
02.34 
.12 
0.12 (Wrong order here) 
0 
000.000 
-100 

予想される出力

90 
56.6 
50 
02.34 
0.12 
.12 
0 
000.000 
-100 

ソリューション

for (int i = 0; i < n; i++) { 
     for (int j = 1; j < (n - i); j++) { 
     String temp=""; 
     if(new BigDecimal(s[j-1]).compareTo(new BigDecimal(s[j])) < 0) { 
      temp = s[j-1]; 
      s[j-1] = s[j]; 
      s[j] = temp; 
     } 
     } 
+0

質問を編集する必要があります。まず、BigIntegerではなく、BigDecimalを解析しています。また、* even *ではなく* equal *の項目の順序を維持したいとします。数字について話すとき、「均等」と「均等」は明確に異なる意味を持ちます。最後に、あなたが求めていることは[安定した並べ替え](http://www.geeksforgeeks.org/stability-in-sorting-algorithms/)と呼ばれています。選択したソートは安定したソートではありません。別のアルゴリズムで置き換える必要があります。挿入ソートとバブルソートの両方が安定しており、選択ソートとして簡単にコーディングすることができます。 –

答えて

2

問題は、使用している選択ソートアルゴリズムが安定していないことです。つまり、等しい値を持つアイテムがリスト内で相対的な順序を維持することは保証されません。この簡単な商品リストを考えてみましょう:[5.0, 5, 3, 6]

降順でソートしたい場合は、選択ソートの最初のパスの後に、[6, 5, 3, 5.0]があります。5.06と交換されました。アイテム5.05は現在故障しており、そのままになります。

挿入ソートとバブルソートは、同等のアイテムの相対的な順序を維持する安定したアルゴリズムです。選択ソートの代わりに、これら2つのアルゴリズムのいずれかを使用することをお勧めします。

+0

Correctamundoは、本当に悪いソートアルゴリズムを使用していました – Jessica

0

私は別のアプローチを推奨し、より良い抽象的なを使用しています。 Map<BigDecimal, String>を使用できます。マップ:ユーザーが入力した文字列。マップキー:その文字列を解析して取得したBigDecimalオブジェクト。

マップキーを並べ替えるだけで済みます。ソートされた順序でそれらを印刷するときは、各BigDecimalをキーとして使用して、マップに最初の「文字列」値を与えます。以下のような

何か:

Map<BigDecimal, String> stringsByValue = new HashMap<>(); 
stringsByValue.put(... 

for (BigDecimal value : Collections.sort(stringsByValue.keySet())) { 
    String originalInput = stringsByValue.get(value); ... 

はたぶんそれは、同じ値の元の順序を維持するために、いくつかのチューニングが必要です。

+0

あなたは 'BigDecimal'を意味します、そうですか? –

+0

はい、それを修正しました。ありがとう。 – GhostCat

+0

'Collections.sort'はそのようには動作しません。それは 'Set'を受け入れず、反復可能な結果を​​返しません。また、マップを塗りつぶして順番に反復したい場合は、最初に 'TreeMap'を使用してみてください... – Holger

0

使用com.google.gson.internal.LinkedTreeMap

値に匹敵するキーのマップ。 TreeMapとは異なり、このクラスは繰り返し順序の挿入順を使用します。比較順序は、挿入と削除を効率的に行うための最適化としてのみ使用されます。

javaにはLinkedHashMapがあります。

Mapインタフェースのハッシュテーブルとリンクリストの実装、予測可能な繰り返し順序を持つ...

しかし、それを注文されていません。

関連する問題