我不明白发生了什么。最近我使用this代码编辑了一下。我发现了一个错误,所以我试图调试它并遇到奇怪的行为。为什么由2个由相同字母组成的2个不同字符数组创建的2个字符串不相等,并且还会剪切调试字符串。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class AlphanumericComparer : IComparer<string>
{
public int Compare(string s1, string s2)
{
if (s1 == null || s2 == null)
return 0;
int len1 = s1.Length;
int len2 = s2.Length;
int i1 = 0;
int i2 = 0;
while (i1 < len1 && i2 < len2)
{
char c1 = s1[i1];
char c2 = s2[i2];
char[] chunk1 = new char[len1];
int j1 = 0;
char[] chunk2 = new char[len2];
int j2 = 0;
do
{
Debug.Log("1: " + i1 + " _ " + j1 + " _ " + c1); // Seems to be OK.
chunk1[j1++] = c1;
i1++;
if (i1 < len1)
c1 = s1[i1];
else
break;
} while (char.IsDigit(c1) == char.IsDigit(chunk1[0]));
do
{
Debug.Log("2: " + i2 + " _ " + j2 + " _ " + c2); // Seems to be OK.
chunk2[j2++] = c2;
i2++;
if (i2 < len2)
c2 = s2[i2];
else
break;
} while (char.IsDigit(c2) == char.IsDigit(chunk2[0]));
string str1 = new string(chunk1);
string str2 = new string(chunk2);
Debug.Log(str1.CompareTo(str2) + " " + str1 + " " + str2); // "1"?! And also why is string cutted?!
int result;
if (char.IsDigit(chunk1[0]) && char.IsDigit(chunk2[0]))
{
result = int.Parse(str1).CompareTo(int.Parse(str2));
//Debug.Log(s1 + " _ " + s2 + " _ " + int.Parse(str1) + " _ " + int.Parse(str2) + " _ " + result);//tmp
Debug.Log(string.Format("{0}, {1}, {2}, {3}, {4}", s1, s2, int.Parse(str1), int.Parse(str2), result));//tmp
}
else
{
result = str1.CompareTo(str2);
//Debug.Log(s1 + " _ " + s2 + " _ " + str1 + " _ " + str2 + " _ " + result);//tmp
Debug.Log(string.Format("{0}, {1}, {2}, {3}, {4}", s1, s2, str1, str2, result));//tmp
}
if (result != 0)
return result;
}
return len1 - len2;
}
}
我试图重新加载所有IDE,但它没有带来任何东西。我比较的字符串:
string[] test = new string[] { "qwe45", "qwe13a" };
对于下一个字符串排序按预期工作并且行为不同但是仍然存在削减的调试字符串错误:
string[] test = new string[] { "qwe45", "qwe13" };
我做错了什么,或者如果我不是,如何解决这个问题?
更新
如果我像这样分开:
Debug.Log(str1);
Debug.Log(str2);
它显示正确的东西,但CompareTo
仍然会返回一些垃圾。
答案 0 :(得分:3)
我很难理解代码试图完成的内容,但在我看来,你的声明char[] chunk1 = new char[len1];
创建的变量只是一个字符太短。
len1
是第一个输入字符串的长度,在您的示例中("qwe45"
) 5 。所以chunk1
将有五个内存空间字符,允许四个字符的字符加上终止0。
然后使用str1
将其复制到string str1 = new string(chunk1);
,这意味着str1
现在将缩短一个字符。这不是你遗失的那个角色吗?