我有两个长度相等的字符串(1' s和0' s),并希望对这些字符串应用逻辑OR。
我应该如何处理这个问题。我正在使用c#。
当我考虑显而易见的解决方案时,读取每个字符并应用OR |对他们来说,我必须处理apx,250000个字符串,每个长度为500。这会扼杀我的表现。
表现是我的主要关注点。
提前致谢!
答案 0 :(得分:4)
这是最快的方式:
string x="";
string y="";
StringBuilder sb = new StringBuilder(x.Length);
for (int i = 0; i < x.Length;i++ )
{
sb.Append(x[i] == '1' || y[i] == '1' ? '1' : '0');
}
string result = sb.ToString();
答案 1 :(得分:3)
由于提到速度是一个重要因素,因此最好使用逐位操作。
查看ASCII table:
'0'
为0x30
,或00110000
为二进制。'1'
为0x31
,或00110001
为二进制。只有角色的最后一位不同。因此 - 我们可以有把握地说,对字符本身执行按位OR将产生正确的字符。
我们可以做的另一件重要事情是优化速度是使用StringBuilder
,初始化为我们字符串的初始容量。或者甚至更好:我们可以重复使用StringBuilder
进行多项操作,但我们必须确保StringBuilder
有足够的容量。
考虑到这些优化后,我们可以制定这种方法:
string BinaryStringBitwiseOR(string a, string b, StringBuilder stringBuilder = null)
{
if (a.Length != b.Length)
{
throw new ArgumentException("The length of given string parameters didn't match");
}
if (stringBuilder == null)
{
stringBuilder = new StringBuilder(a.Length);
}
else
{
stringBuilder.Clear().EnsureCapacity(a.Length);
}
for (int i = 0; i < a.Length; i++)
{
stringBuilder.Append((char)(a[i] | b[i]));
}
return stringBuilder.ToString();
}
请注意,这适用于您希望对字符串执行的所有按位操作,您只需修改|
运算符。
答案 2 :(得分:2)
我有两个长度相等的字符串(1和0),并且会 喜欢在这些字符串上应用Logical OR。
您可以编写一个自定义逻辑OR运算符或函数,它将两个字符作为输入并生成结果(例如,如果输入字符中至少有一个为'1'则返回'1' - 否则返回'0')。将此函数应用于字符串中的每个字符。
你也可以看看这种方法。您首先需要将每个字符转换为布尔值(例如'1'对应于true),在两个布尔值之间执行OR运算,将结果转换回字符'0'或'1' - 这取决于逻辑OR的结果是否为false或者分别为真。然后只需将此操作的每个结果相互附加。
答案 3 :(得分:2)
我发现这比所有提出的解决方案都要快。它结合了@Gediminas和@Sakura的答案中的元素,但使用了预先初始化的int counter = 0;
String temp = null;
final int BATCH_SIZE = 1000;
try (BufferedReader br = new BufferedReader(new FileReader(path)) {
while ((temp = br.readLine()) != null) {
text.append(temp);
++counter;
/* Process In Batches */
if(counter % BATCH_SIZE == 0) {
/* Prepare & Append JSON Objects */
obj = prepareAppendJSON(text.toString(), obj);
/* Clear text */
text.setLength(0);
}
}
/* Last Iteration */
obj = prepareAppendJSON(text, obj);
text = new StringBuilder();
} catch (IOException ex) {
ex.printStackTrace();
}
而不是char[]
。
虽然StringBuilder
在内存管理方面很有效,但每个StringBuilder
操作都需要对标记进行一些记录,并且只执行比数组索引更多的操作。
Append
答案 4 :(得分:1)
您可以使用bug report on github.com查询进行压缩,然后汇总结果:
var a = "110010";
var b = "001110";
var result = a.Zip(b, (i, j) => i == '1' || j == '1' ? '1' : '0')
.Select(i => i + "").Aggregate((i, j) => i + j);
基本上,Linq扩展方法采用两个序列并对两个序列的每个对应元素应用一个动作。然后我使用Zip从char
投射到String
,最后我Select来自一系列字符串的结果(&#34; 0&#34;和&# 34; 1&#34;)到一个字符串。