質問
私の実施、バブルソートアルゴリズムとしてほしいと思いますを入れることができるようなも Integer
や String
パラメータ。私はキャスト全ての入力を文字列としての compareTo
比較する方法の整数型鋳として文字列の文字列です。みん間違った答えが compareTo
比較の鋳整数です。なぜですか?
解決
整数となります。compareToな数値としこのと考えている。
文字列になります。compareTo種文字列を辞書的;それは、アルファベット順.
私はWindows3.1のフォルダから写真をデジタルカメラを命じられたようになります:写真1,PHOTO10,PHOTO100,写真2,PHOTO20,PHOTO3,...います。Windows XPないようにする:写真1,写真2,PHOTO3,...など。これは、特別の仕分けルールの文字列を表す。
に辞書の順序付け、各キャラクター一つの文字列を比較して、対応する文字を別の文字列B.各対応する文字の文字列:
- た場合の現在の文字を辞書的に比して、アルファベット)の文字、そしてB
- 場合の文字は以下の文字は、Bに対してA.
- の場合には、文字になるかはわかりません。その次のチェックします。
- がない場合はキャラクターの左の文字列、短い方の取り付け前になります。
- がない場合はより多くの文字の左両方の文字列、そして、同じ文字列になります。
第こちらかを願っています"と誤った回答を想定し、エディの分析の問題に通知するものとします。
を考慮する文字列に"10"と"2".辞書の順序付けが見る最初の文字を、それぞれに'1'、'2'です。文字'1'が'2'の文字セットをJavaのメソッドを使うなどの"10"を"2"には"裸"でソートされる前に"ハレ"で'b'が'h'.
ていただきたいキャスト-ス文字列の整数前です。使整数です。parseStringではないかと思います。
他のヒント
あなたは同じリストに整数と文字列を混在してもよろしいですか?そうならば、文字列より小さいか大きい整数でありますか?この特定のソート基準は何ですか?
あなたはまた、個別の整数のリストと文字列のリスト(および他のクラスのリスト)をソートバブルソート方法を行うことができます。そうするために、あなたはジェネリックを使用することができます。例えばます:
public static <T> void bubbleSort(List<T> elements, Comparator<T> comparator) {
// your implementation
}
あなたは彼らが(同時に両方ではない)整数や文字列ことができる理由です、comparator
を比較するelements
パラメータを使用します。コンパイラは[警告なし]あなたは1クラスと別のクラスのコンパレータのオブジェクトのリストを渡すことができないので、比較は常に動作します。
Comparable
のインスタンスを取ります。
文字列が実際に整数にキャストすることはできない、と何comparryo方法はありません。
あなたが記述することは実際には不可能である...ので、おそらくあなたは、コードをポストする必要があります。ここWHTあなたがやっているの私の解釈です。
public int compareTo(final Object o)
{
final String str;
str = (String)o; // this will crash if you pass it an Integer.
// rest of the code.
}
のcompareToのドキュメントはこちらです、あなたは本当に契約に従ってください。
まず、あなたがしたい 匹敵するコンパレータがかかるため匹敵する一方、2つのオブジェクトが渡されたものに現在のオブジェクトを比較して、あなたは、文字列または整数上のcompareTo()メソッドを変更することはできませんのでます:
public class CompareIntegersAsStrings implements Comparator {
public int compare(Object o1, Object o2) {
return o1.toString().compareTo(o2.toString());
}
}
あなたが本当に意味することは、あなたが文字列に整数に変換して、比較しているということです、これは動作しませんと仮定。たとえば、あなたが整数1234
と整数1
と整数2
を持っているとしましょう。あなたは文字列にこれらを変換し、それらを比較した場合、ご注文を取得します。
1
1234
2
ASCIIの並べ替えのための正しい数値ソートのために間違っていました。つまり、私はあなたのコードはこのような何かをすると仮定します:
public int myCompare(Integer a1, Integer a2) {
myCompare(String.valueOf(a1), String.valueOf(a2));
}
public int myCompare(String a1, String a2) {
....
}
なぜ私はこれを前提としていますか?あなたは間違った結果を取得し、例外を得ることについて話していない話をしているので。あなたが実際に例外を取得している場合は、他のポスターは、鋳造が動作しないことが正しいです。
これは、なぜなら2つの文字列間の文字の最小の長さのみが比較さString
クラスの以下のJava APIのコードです。
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2); //**HERE**
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
私たちは比較するには、このAPIを使用する場合
String first = "ABCD";
String second = "ABZ";
System.out.println("" + "ABCD".compareTo("ABZ")); //-23
ABCDはABZ CがZ未満であり、最初の文字列にDを無視する手段未満であると言って負の値を返します。
だから、多分私達は、
以下のようなものが必要class StringNumericComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
int len1 = o1.length();
int len2 = o2.length();
if(len1 != len2) {
return len1 - len2; //Else iterate all diff lengh chars and SUM it.
}
int lim = Math.min(len1, len2);
char v1[] = o1.toCharArray();
char v2[] = o2.toCharArray();
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return 0;
}
}