【问题标题】:Generic Mergesort Works on Integers but doesn't finish with strings?通用合并排序适用于整数,但不能以字符串结尾?
【发布时间】:2011-04-29 21:29:29
【问题描述】:

无论出于何种原因,尽管事实上它是完全通用的并且在使用字符串进行测试时可以使用整数,但它似乎跳过了最后一次合并迭代。我已经搜索了我的代码几个小时,但我看不出它为什么不能正常工作,所以任何人的任何见解都会受到好评!

导入 java.util.Iterator;进口 java.util.LinkedList;

/** * * @author 保罗 */ public 类合并排序> {

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),

trueSort(右)); }

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

LinkedList 对){ LinkedList 结果 = 新的 LinkedList(); 而 (left.size() > 0 || right.size() > 0) { if (left.size() > 0 && right.size() > 0) { if (left.getFirst().compareTo(right.getFirst()) 0) { 结果.add(left.pop()); } 别的 { 结果.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

以后是纯静态的 数字 = 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); 单词 = 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,享受,你好,我,是,加入, MY,StarDestroyer-MobileHome? (TM值), 海滩,进来,进来,喜欢,长,我,我的, 姓名,去,走,会,你

如您所见,数字已完全排序。字符串似乎错过了合并的最后一次迭代。那么到底出了什么问题呢?

【问题讨论】:

  • 我完全拒绝阅读。格式化您的代码。

标签: java sorting merge


【解决方案1】:

字符串比较区分大小写。也就是说,所有大写字符串都将放在小写字符串之前。您的合并排序算法应该允许采用自己的比较器,对于您的用例,它可以是 String.CASE_INSENSITIVE_ORDER。

【讨论】:

  • 谢谢,我完全重写了它以供静态使用并为比较器重载。效果很好,欣赏!
【解决方案2】:

您的代码很好,并且排序正确。 您需要了解大写字母与小写字母不同。当比较“My”和“beach”时,你会发现“My”应该在“beach”之前(因为大写字母在小写字母之前)。

这就是为什么在您的结果中,所有大写字母都将所有以大写字母开头的单词放在开头。

您可能希望使用compareToIgnoreCase() 方法(在字符串上定义)来比较您的字符串,同时忽略字母的大小写。

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

(请重新格式化您的代码)

【讨论】:

    猜你喜欢
    • 2015-02-02
    • 2014-07-13
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2017-01-06
    相关资源
    最近更新 更多