首页 新闻 会员 周边

求一处理字符串的算法

0
悬赏园豆:50 [已关闭问题]

在开发的过程中遇到这样一个问题。
如字符串: 1232%%%112%%%12322%%%112%%%23121%%%1231%%%
以%%%分割的字符串, 现在要求去掉重复的值,并记录重复的次数 (相当于数据库里的group by)
开始的时候处理方法是:

split进行分割,然后遍历插入Map (Java)中,以字符串为Key,以出现的数量为Value, 后来随着字符串越来越长,性能也急剧下降,

在处理 5万个上述分割字符串的时候 时间竟然达到了 1485毫秒。 (普通的双核pc机 2G内存)
这是绝对不可接受的,求类似处理字符串的高效算法

TaranChen的主页 TaranChen | 初学一级 | 园豆:100
提问于:2009-06-18 19:31
< >
分享
其他回答(3)
0

你看看我们 .net 的效率如何,不要生气,随便写写.

 

 

Stopwatch watch = new Stopwatch();

watch.Start();

string str = "1232%%%112%%%12322%%%112%%%23121%%%1231%%%7232%%%192%%%12622%%%119%%%23521%%%1631%%%";
StringBuilder sBuilder
= new StringBuilder();
for (int i = 0; i < 100000; i++)
sBuilder.Append(str);

string[] strs = sBuilder.ToString().Split(new string[]{"%%%"},StringSplitOptions.RemoveEmptyEntries);

var booleanGroupQuery
= from str1 in strs
group str1 by str1;

foreach (var strGroup in booleanGroupQuery)
{
Console.WriteLine(
"{0} {1}", strGroup.Key, strGroup.Count<string>());
}

watch.Stop();
Console.WriteLine(watch.Elapsed);
Console.WriteLine(watch.ElapsedMilliseconds);

Console.Read();
                        
Launcher | 园豆:45045 (高人七级) | 2009-06-18 20:59
0

我用.net 中的Dictinary 实现的,方法和楼主的应该是一样的,但5万个分割字符串时用时只有90毫秒,楼上那个大概是600毫秒。不知道是不是我对楼主问题的理解有误?我没试过 Java 但我觉得Java不应该被.net 慢这么多吧。下面是代码,前面的是楼上的方法,后面的是我的方法。

 

        public static void GroupBy()
        {
            Stopwatch watch = new Stopwatch();
           
            Random rand = new Random();
            StringBuilder sBuilder = new StringBuilder();
            for (int i = 0; i < 50000; i++)
            {
                int j = 0;
                string str = "";

                while (j++ < rand.Next(3,5))
                {
                    str += rand.Next(1, 5).ToString();
                }
                sBuilder.AppendFormat("{0}%%%", str);
            }

            watch.Start();


            string[] strs = sBuilder.ToString().Split(new string[] { "%%%" }, StringSplitOptions.RemoveEmptyEntries);

            var booleanGroupQuery = from str1 in strs
                                    group str1 by str1;

            foreach (var strGroup in booleanGroupQuery)
            {
                Console.WriteLine("{0} {1}", strGroup.Key, strGroup.Count<string>());
            }

            watch.Stop();

            Console.WriteLine(watch.Elapsed);
            Console.WriteLine(watch.ElapsedMilliseconds);

            watch.Reset();
            watch.Start();

            Dictionary<string, int> map = new Dictionary<string, int>();

            strs = sBuilder.ToString().Split(new string[] { "%%%" }, StringSplitOptions.RemoveEmptyEntries);

            foreach (string str in strs)
            {
                if (map.ContainsKey(str))
                {
                    map[str]++;
                }
                else
                {
                    map.Add(str, 1);
                }
            }

            foreach (string str in map.Keys)
            {
                Console.WriteLine("{0} {1}", str, map[str]);
            }
            watch.Stop();

            Console.WriteLine(watch.Elapsed);
            Console.WriteLine(watch.ElapsedMilliseconds);
            Console.Read();
        }

eaglet | 园豆:17139 (专家六级) | 2009-06-19 08:07
0

引自:http://selives.blogbus.com/logs/27714366.html

线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类。 

Collection 
List 
│├LinkedList 
│├ArrayList 
│└Vector 
│ └Stack 
└Set 
Map 
├Hashtable 
├HashMap 
└WeakHashMap 

------------------------------------------------------------------------------------------------

我对java类库不熟,在处理大批量无序数据的时候,hash效率最高,我本能的感觉大概楼主用错了容器。我查了一下,Map 不等于 HashTable,所以建议楼主更换容器再试。

陛下 | 园豆:3938 (老鸟四级) | 2009-06-19 09:40
0

     System.Collections.Hashtable hs=new System.Collections.Hashtable ();
            string[] list = sBuilder.ToString().Split(new char[]{'%','%','%'});
            list.g
            foreach (string var in list)
            {
                if (hs.Contains(var))
                    hs[var] = Convert.ToInt32(hs[var]) + 1;
                else
                    hs.Add(var, 1);

            }

 

.net版本。。和2楼貌似。哈哈真理都是有共性的啊。

邢少 | 园豆:10926 (专家六级) | 2009-06-19 10:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册