簡體   English   中英

通用合並排序適用於整數,但不能以字符串結尾?

[英]Generic Mergesort Works on Integers but doesn't finish with strings?

無論出於何種原因,盡管事實上它是完全通用的並且在使用字符串測試時使用整數,但它似乎跳過了最后一次合並迭代。 我已經搜索了我的代碼幾個小時,但我看不出它為什么不能正常工作,所以任何人的任何見解都會受到好評!

導入 java.util.Iterator; 導入 java.util.LinkedList;

/** * * @author paul */ public class MergeSort> {

 LinkedList<T> theList; MergeSort(LinkedList<T> toBeSorted) { theList = toBeSorted; } public LinkedList<T> sort() { return trueSort(theList); } private LinkedList<T> trueSort(LinkedList<T> sorting) { if (sorting.size() <= 1) { return sorting; } LinkedList<T> left, right, sorted; left = new LinkedList<T>(); right = new LinkedList<T>(); int middle = sorting.size() / 2; Iterator<T> sojourner = sorting.iterator(); for (int i = 0; sojourner.hasNext(); i++) { if (i < middle) { left.add(sojourner.next()); } else { right.add(sojourner.next()); } } return trueMerge(trueSort(left),

真排序(右)); }

 private LinkedList<T> trueMerge(LinkedList<T> left,

LinkedList right) { LinkedList 結果 = new LinkedList(); while (left.size() > 0 || right.size() > 0) { if (left.size() > 0 && right.size() > 0) { if (left.getFirst().compareTo(right .getFirst()) < 0) { result.add(left.pop()); } else { result.add(right.pop()); } } else if (left.size() > 0) { result.add(left.pop()); } else { result.add(right.pop()); } } 返回結果; } }

這是我的主要 java 文件

import java.util.Iterator; import java.util.LinkedList; import java.util.Random; /** * * @author paul */ public class Main { public static Random Rand; public static int randomNumber(int min, int max) { return min + (int) (Rand.nextDouble() * ((max - min) +

1)); }

 public static <T> String getString(LinkedList<T> linkInt) { String s = ""; Iterator<T> interLink = linkInt.iterator(); for (int i = 0; interLink.hasNext(); i++) { s = s + interLink.next().toString(); if (interLink.hasNext()) { s = s + ", "; } if ((i + 1) % 10 == 0) { s = s + "\n"; } } return s; } /** * @param args the command line arguments */ public static void main(String[] args) { Rand = new Random(); LinkedList<Integer> numbers = new LinkedList<Integer>(); for(int i = 0; i< 100;i++){ numbers.add(randomNumber(1,1000)); } System.out.println(getString(numbers)); MergeSort m = new MergeSort(numbers); //change this

后來純粹是 static numbers = m.sort(); System.out.println(getString(numbers));

 LinkedList<String> words = new LinkedList<String>(); words.add("Hello"); words.add("MY"); words.add("name"); words.add("Is"); words.add("Barthoal"); words.add("I"); words.add("Enjoy"); words.add("long"); words.add("beach"); words.add("walks"); words.add("would"); words.add("you"); words.add("like"); words.add("to"); words.add("come"); words.add("Join"); words.add("me"); words.add("in"); words.add("my"); words.add("StarDestroyer-MobileHome?

(TM)"); System.out.println(getString(words)); MergeSort mm = new MergeSort(words); words = mm.sort(); System.out.println(getString(words)); } }

這輸出:

304、842、342、794、574、99、250、885、408、387、899、73、391、883、771、848、968、504、129、370、994、897、649、345、983、 326、688、547、541、567、777、987、201、326、298、959、166、962、864、797、512、505、609、208、21、43、458、442、138、570、 455、442、516、294、406、310、215、212、397、98、938、496、263、973、571、861、687、276、927、608、421、831、820、510、68、 172、504、8、976、992、68、497、33、233、607、587、611、695、834、338、448、978、359、413、1、819、18、977、693、649

1、8、18、21、33、43、68、68、73、98、99、129、138、166、172、201、208、212、215、233、250、263、276、294、298、 304, 310, 326, 326, 338, 342, 345, 359, 370, 387, 391, 397, 406, 408, 413, 421, 442, 442, 448, 455, 458, 496, 497, 504, 504, 505、510、512、516、541、547、567、570、571、574、587、607、608、609、611、649、649、687、688、693、695、771、777、794、797、 819、820、831、834、842、848、861、864、883、885、897、899、927、938、959、962、968、973、976、977、978、983、987、992、994

你好,我的名字,是,Barthoal,我,享受,長,海灘,散步,會,你,喜歡,來,加入,我,在,我的 StarDestroyer-MobileHome 嗎? (TM值)

Barthoal,享受,你好,我,是,加入,我,StarDestroyer-MobileHome? (TM), beach, come, in, like, long, me, my, name, to, walks, will, you

如您所見,數字已完全排序。 字符串似乎錯過了合並的最后一次迭代。 那么究竟出了什么問題呢?

字符串比較區分大小寫。 也就是說,所有大寫字符串都將放在小寫字符串之前。 您的合並排序算法應該允許采用自己的比較器,對於您的用例,它可以是 String.CASE_INSENSITIVE_ORDER。

您的代碼很好,並且排序正確。 您需要了解大寫字母與小寫字母不同。 當比較“My”和“beach”時,你會發現“My”應該在“beach”之前(因為大寫字母在小寫字母之前)。

這就是為什么在您的結果中,所有大寫字母都將所有以大寫字母開頭的單詞放在開頭。

您可能希望使用compareToIgnoreCase()方法(在字符串上定義)來比較您的字符串,同時忽略字母的大小寫。

在此處查看此方法的詳細信息: http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#compareToIgnoreCase(java.lang.String

(請重新格式化您的代碼)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM