- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
使用
StringComparer comparer1 = StringComparer.Ordinal;
而不是
IComparable v
IComparable w
comparer1.Compare(v, w)
解决了运行时问题。
我在 Java 和 C# 中对排序算法(例如 Quicksort、Mergesort)做了一些基准测试。
我使用 Java 7 和 .NET Framework 4.5 来实现和执行我的算法。它表明所有算法都可以使用 Java 实现更好的运行时。
快速排序的一些示例运行时:
C#
Java
然后我使用分析工具进行了测量:C# 使用 75% 的运行时进行字符串比较(即 CompareTo),而 Java 仅使用 2% 的运行时进行比较。
为什么字符串比较在 C# 中如此昂贵,而在 Java 中则不然?
编辑:我还测试了 C# 排序函数 Arrays.sort(INPUT) 对于 n=1000000,它可以达到大约 3000 毫秒,所以我认为代码不是问题所在。但无论如何:
这是快速排序的代码:
public class Quicksort {
public static void sort(IComparable[] a) {
sort(a, 0, a.Length - 1);
}
private static void sort(IComparable[] a, int lo, int hi) {
if (hi <= lo) return;
int j = partition(a, lo, hi);
sort(a, lo, j-1);
sort(a, j+1, hi);
}
private static int partition(IComparable[] a, int lo, int hi) {
int i = lo;
int j = hi + 1;
IComparable v = a[lo];
while (true) {
while (less(a[++i], v))
if (i == hi) break;
while (less(v, a[--j]))
if (j == lo) break;
if (i >= j) break;
exch(a, i, j);
}
exch(a, lo, j);
return j;
}
public static IComparable select(IComparable[] a, int k) {
if (k < 0 || k >= a.Length) {
throw new Exception("Selected element out of bounds");
}
Rnd.Shuffle(a);
int lo = 0, hi = a.Length - 1;
while (hi > lo) {
int i = partition(a, lo, hi);
if (i > k) hi = i - 1;
else if (i < k) lo = i + 1;
else return a[i];
}
return a[lo];
}
private static bool less(IComparable v, IComparable w) {
return (v.CompareTo(w) < 0);
}
private static void exch(Object[] a, int i, int j) {
Object swap = a[i];
a[i] = a[j];
a[j] = swap;
}
}
然后按如下方式测量快速排序:
Stopwatch.Restart();
Quicksort.sort(stringArray);
Stopwatch.Stop();
EDIT2:有人想查看 Java 版本。完全一样,我只是使用 Comparable 而不是 IComparable 和 Array.length 而不是 Array.Length
最佳答案
so i don't think the code is the problem
我不敢苟同。在这两种情况下,您都没有比较相同的事物。诚然,您也没有向我们展示如何生成字符串等并没有帮助,但是 Java 和 .NET 执行不同的默认字符串比较。
来自 Java 的 String.compareTo
:
Compares two strings lexicographically.
来自 .NET 的 String.CompareTo
:
This method performs a word (case-sensitive and culture-sensitive) comparison using the current culture.
这比进行纯粹的字典比较慢也就不足为奇了。
仅将 .NET 与自身进行比较就很容易看出这一点...
using System;
using System.Diagnostics;
using System.Text;
class Test
{
static void Main()
{
string[] source = GenerateRandomStrings();
string[] workingSpace = new string[source.Length];
CopyAndSort(source, workingSpace);
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 1000; i++)
{
CopyAndSort(source, workingSpace);
}
sw.Stop();
Console.WriteLine("Elapsed time: {0}ms",
(long) sw.Elapsed.TotalMilliseconds);
}
static string[] GenerateRandomStrings()
{
Random rng = new Random();
string[] ret = new string[10000];
for (int i = 0; i < ret.Length; i++)
{
ret[i] = GenerateRandomString(rng);
}
return ret;
}
static string GenerateRandomString(Random rng)
{
char[] chars = new char[30];
for (int i = 0; i < chars.Length; i++)
{
chars[i] = (char) rng.Next('A', 'z' + 1);
}
return new string(chars);
}
static void CopyAndSort(string[] original, string[] workingSpace)
{
Array.Copy(original, 0, workingSpace, 0, original.Length);
Array.Sort(workingSpace);
// Array.Sort(workingSpace, StringComparer.Ordinal);
}
}
自己尝试一下,根据您是否指定序号字符串比较器来改变 CopyAndSort
方法。使用序数比较器要快得多,至少在我的盒子上是这样。
关于c# - 为什么 Java 中的字符串比较 (CompareTo) 比 C# 中更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15213562/
这似乎很奇怪,这并没有像我预期的那样工作。我编写了一个简单的java类,它实现Comparable接口(interface)并重写compareTo()方法。但是,它不允许我传递除对象之外的特定类型的
public int compareTo(Object another) throws CustomMadeException { if(this.getClass() != another.
早些时候,我在通用 IComparable 中获得了逆变的具体示例Jon Skeet 的界面。然而,这又产生了另一个问题。为什么不是通用的 List.Sort()方法能够推断出相同的信息? 我在这里提
我有注释 package javaannotationtest; import java.lang.annotation.*; @Target({ElementType.METHOD}) @Reten
我试图理解 C# 中的 CompareTo(),下面的示例让我比以往任何时候都更加困惑。有人能帮我理解为什么第三个变体的结果是 1 吗?句子“Hello wordd”中的第二个词与 str1“Hell
我已经在这个程序上工作了几天,并且在我的 BinarySearchTree 类中实现了一些主要方法,例如插入和删除。插入似乎工作正常,但是一旦我尝试删除,我就会不断出错。因此,在玩弄了代码之后,我想测
首先,我必须提到的是,在阅读了大量问题和教程并观看了一些视频后,问题仍然没有解决。 我是一名Java中级程序员,我编写了一些用于比较优先级队列中的元素的代码,其中元素的保存方式类似于[Comparab
我只是在为即将到来的考试做一些复习。我发现了我们的讲师给我们提供的这段代码供我们修改。 代码: public class Employee implements Comparable{ private
我的书要求我为一段代码编写 Javadoc 注释。大多数情况下,我了解如何执行 javadocs,但我不了解该程序在做什么。 “为类 Person 的以下方法编写 Javadoc 注释。假设类 Per
如果我写以下内容是否有可能溢出: public class SomeObj implements Comparable { private final float data; pub
我有一个名为任务的类,我想将其放入 PriorityQueue 中。 我的类(class)通过日期和名为isUrgent的 boolean 字段进行比较 @Override publ
这个问题已经有答案了: Java error: Comparison method violates its general contract (13 个回答) 已关闭 7 年前。 我有这个compa
我的类(class)结构: public class Priorityy implement Comparable { public int compareTo(Object pe) {
给定一个非负整数列表,我想对它们进行排列,使它们形成最大的数字。给定 [1, 20, 23, 4, 8],最大的形成数字是 8423201。但我想弄清楚compareTo 方法中变量的顺序如何影响 A
我想通过上次联系日期比较两个“收件人”,如果相同,则通过地址进行比较。这是我的代码: public class RecipientComparator implements Comparator {
package Comparable; public class Movie implements Comparable { private double rating; privat
您好,我在实现compareTo 方法时遇到问题。我一直在寻找答案,但没有任何帮助。我正在尝试用各种大小的圆圈填充 TreeSet。我需要在我的圈子类中使用compareTo 才能以这种方式存储它们。
我有以下代码;目的是返回数组中按字母顺序排列的最小成员。 public String smallest() { String smallest = ""; int i = 0; while(log[i
我有一个关于compareTo函数如何协助比较器进行排序的问题即 o1.compareTo(o2) 与 o2.compareTo(o1) 如果两个字符串相等,则此方法返回 0,否则返回正值或负值。如果
帮助我无法弄清楚compareTo函数。这就是我必须做的:编写一个compareTo函数,可用于根据以下内容按顺序放置产品到他们的零件号。也就是说,后面按字母顺序排列的零件号顺序大于按字母顺序排列较早
我是一名优秀的程序员,十分优秀!