查找2字符串相同的子串

ma2jiajia 2010-01-31 01:50:07
str1 = '2,7,9,67,95,43,0,21'
str2 = '8,9,5,98,34,7'
字符串中不会出现重复元素
现在想要将str1中与str2中重复的元素添加到str3中
简单的方法就是2个循环了
有没有比较好的方法呢??

顺便问下,上面的字符串可以使用split()转成array
那有函数可以直接将array转换成字符串吗??或者有什么比较好的方法将array转成字符串吗??
...全文
301 14 打赏 收藏 举报
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xmliy 2010-01-31
  • 打赏
  • 举报
回复
还有一种也不错:


var array = [], str = str1 + ',' + str2;
str.replace(/([^,]*)/g, function($0, $1, i) {
if (str.indexOf($1) == i) array.push($1);
});
ma2jiajia 2010-01-31
  • 打赏
  • 举报
回复
seeu1688 算法耗时:0 毫秒
wcwtitxu 算法耗时:297 毫秒
ma2jiajia 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wcwtitxu 的回复:]
JScript codevar str1='2,7,9,67,95,56,43,0,21';var str2='8,9,5,98,34,7';var str3= ((str1+","+str2).match(/\b(\d+)\b(?=.*\b\1\b)/g)||[]).join(",");


alert(str3);
[/Quote]

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<script type="text/javascript">
//CSDN seeu1688 提供的过滤数组重复元素算法
Array.prototype.unique = function() {
var a = {};
for (var i = 0; i < this.length; i++) {
if (typeof a[this[i]] == "undefined") a[this[i]] = 1;
}
this.length = 0;
for (var i in a) {
this[this.length] = i;
}
return this;
}
//修改 seeu1688 的算法
Array.prototype.iterate = function() {
var a = {};
var b = {};
for (var i = 0; i < this.length; i++) {
if (typeof a[this[i]] == "undefined") {
a[this[i]] = 1;
} else if (typeof b[this[i]] == "undefined") {
b[this[i]] = 1;
}
}
this.length = 0;
for (var i in b) {
this[this.length] = i;
}
return this;
}

String.prototype.iterate = function(str) {
arr = (str+","+this).split(",");
return arr.iterate().toString();
}
var array1 = new Array();
var array2 = new Array();
for (var i = 0; i < 2000; i++) {
array1[array1.length] = Math.floor(Math.random() * 2000);
array2[array2.length] = Math.floor(Math.random() * 2000);
}

var str1 = array1.unique().toString();
var str2 = array2.unique().toString();

document.write("array1 = " + array1 + "<br /><br/>");
document.write("array2 = " + array2 + "<br/><br/>");
//CSDN wcwtitxu 提供的算法
function itStr() {
str3 = ((str1 + "," + str2).match(/\b(\d+)\b(?=.*\b\1\b)/g) || []).join(",");
return str3;
}

var d = new Date().getTime();
document.write("array3 = " + str1.iterate(str2) + "<br /><br/>");
d = new Date().getTime() - d;
document.write("seeu1688 算法耗时:" + d + " 毫秒<br/><br/>");

var d = new Date().getTime();
document.write("array3 = " + itStr() + "<br /><br/>");
d = new Date().getTime() - d;
document.write("wcwtitxu 算法耗时:" + d + " 毫秒<br/><br/>");
</script>
</body>
</html>

用seeu1688的算法可以更快哦...
http://topic.csdn.net/t/20050307/23/3832202.html
consatan 2010-01-31
  • 打赏
  • 举报
回复
.....................3连了...所以只好用别的号上来回...
数组中允许有重复元素
获取2数组中重复元素
根据wcwtitxu的算法修改的
速度比wcwtitxu在10楼帖的算法快
在数组为30万元素的情况下,快1442.2毫秒
由于2个算法如果同时运算的话,算法的顺序会影响最终结果
把wcwtitxu的算法排在前面,另一个排后面,结果另一个的时间在900毫秒内...但如果顺序反过来的话则不会,但是速度也有改变
所以就每个各执行20次(手动刷新的,非循环),然后取平均值
测试环境依然和上面提到的一样

var array1 = new Array();
var array2 = new Array();
for (var i = 0; i < 10000; i++) {
array1[array1.length] = Math.floor(Math.random() * 10000);
array2[array2.length] = Math.floor(Math.random() * 10000);
}
//数组中元素可重复
//返回2数组中重复元素所组成的新数组
//新数组中元素顺序以array1为准
Array.prototype.iterate = function(arr) {
var obj1 = {},obj2 = {},i,len,res = [];
len = this.length>arr.length?this.length:arr.length;
for(i=0; i < len; i++ ) {
obj1[this[i]] = true;
obj2[arr[i]] = true;
}
for(var t in obj1) if(obj2[t] === true) res.push(t);
return res;
}
//将字符串转成数组,调用Array.iterate(),返回的数组再转为字符串
String.prototype.iterate = function(str) {
return ((this.split(",")).iterate(str.split(","))).join(",");
}

//调用
document.write("String 1 = "+array1.toString()+"<br>");
document.write("String 2 = "+array2.toString()+"<br>");
var d = new Date().getTime();
document.write("new String = "+array1.iterate(array2)+"<br>");
d = new Date().getTime() - d;
document.write("Time: "+d+" ms<br />");
ma2jiajia 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wcwtitxu 的回复:]
第一轮循环的if可以去掉
JScript codefunction iStr() {var a={},res=[],b=str1.split(","),c=str2.split(","),i,len;for (i=0,len=b.length; i<len; i++)a[b[i]]=true;for (i=0,len=c.length; i<len; i++)if(a[c[i]]===true)res.push(c[i]);return res.join(",");
}
[/Quote]
这个没有过滤重复元素的功能哦...
刚还是过滤加获取2字符串重复值...
wcwtitxu 2010-01-31
  • 打赏
  • 举报
回复

var str1 = '2,7,9,67,95,56,43,0,21';
var str2 = '8,9,5,98,34,7';


var str3 = ((str1+","+str2).match(/\b(\d+)\b(?=.*\b\1\b)/g)||[]).join(",");


alert(str3);
ma2jiajia 2010-01-31
  • 打赏
  • 举报
回复
seeu1688 算法耗时:4526 毫秒

wcwtitxu 算法2耗时:2089 毫秒
去掉外循环的结果
ma2jiajia 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wcwtitxu 的回复:]
JScript codefunction iStr() {var a={},res=[],b=str1.split(","),c=str2.split(","),i,len;for (i=0,len=b.length; i<len; i++)if(a[b[i]]!==true)a[b[i]]=true;for (i=0,len=c.length; i<len; i++)if(a[c[i]]===t?-
[/Quote]
将数组过滤重复元素和查找重复元素整合在一起,而且用===加快处理速度
速度比我上面帖的那修改seeu1688算法的快了一倍!!
seeu1688 算法耗时:4584 毫秒

wcwtitxu 算法2耗时:2227 毫秒
字符串为一百万个元素
硬件和浏览器和上面一样
wcwtitxu 2010-01-31
  • 打赏
  • 举报
回复
第一轮循环的if可以去掉

function iStr() {
var a={},res=[],b=str1.split(","),c=str2.split(","),i,len;
for (i=0,len=b.length; i<len; i++)a[b[i]]=true;
for (i=0,len=c.length; i<len; i++)if(a[c[i]]===true)res.push(c[i]);
return res.join(",");
}

ma2jiajia 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xmliy 的回复:]
还有一种也不错:

JScript codevar array= [], str= str1+','+ str2;
str.replace(/([^,]*)/g,function($0, $1, i) {if (str.indexOf($1)== i) array.push($1);
});
[/Quote]
........
貌似这个算法得到的结果不对...
刚只顾着看时间,没看结果...
wcwtitxu 2010-01-31
  • 打赏
  • 举报
回复

function iStr() {
var a={},res=[],b=str1.split(","),c=str2.split(","),i,len;
for (i=0,len=b.length; i<len; i++)if(a[b[i]]!==true)a[b[i]]=true;
for (i=0,len=c.length; i<len; i++)if(a[c[i]]===true)res.push(c[i]);
return res.join(",");
}
ma2jiajia 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xmliy 的回复:]
还有一种也不错:

JScript codevar array= [], str= str1+','+ str2;
str.replace(/([^,]*)/g,function($0, $1, i) {if (str.indexOf($1)== i) array.push($1);
});
[/Quote]
也很不错,不过如果数据量大的话,这个方法就比较慢了
这是字符串一万个元素的情况下
seeu1688 算法耗时:32 毫秒

wcwtitxu 算法耗时:2090 毫秒

xmliy 算法耗时:443 毫秒
===============================
当字符串为十万个元素的话...
seeu1688 算法耗时:382 毫秒

wcwtitxu 算法耗时:239275 毫秒

xmliy 算法耗时:29222 毫秒
=================================
以上结果是在chrome 4.0.249.78下测试的(IE8得等很久...)
CPU是Intel Q9650 3.0G
内存是2G*4 DDR800
CPU占用率在25%
sectue 2010-01-31
  • 打赏
  • 举报
回复
我是进来学习的。
ma2jiajia 2010-01-31
  • 打赏
  • 举报
回复
(—_—b

刚发完就发现array转string还挺多方法的哦...
arrobj.join()
arrobj+""
arrobj.toString()
相关推荐
发帖
JavaScript

8.7w+

社区成员

Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
帖子事件
创建了帖子
2010-01-31 01:50
社区公告
暂无公告