字符数组中数字大小判断问题?急

.Net技术 码拜 9年前 (2015-05-10) 1001次浏览 0个评论
 

string[] s1=new string[]{“1:10″,”2:12”};
string[] s2=new string[]{“1:12″,”2:10”,3:15};

s1与s2比较 冒号前的数字为标识
标识相同的进行比较,比较冒号后的数字看哪个大:

最后结果:
1:12,2:12,3:15

请大家帮我想想看、、、、

up..
快来人帮我解决下咯 小弟我搞的脑壳痛了
3分
把它们放进字典中
foreach s1   split(“”:””)
分别装成int

dic<int,int>.add(1,10);

s2也一样  但插入字典前判断key是否存在 存在则比较大小 不存在则插入

很伪 很伪的代码 嘻嘻

3分
            string[] s1 = new string[] { "1:10", "2:12" };
            string[] s2 = new string[] { "1:12", "2:10", "3:15" };
            IEnumerable<string> ie = s2.Select(x =>
            {
                int i = x.IndexOf("":""); int index = Convert.ToInt32(x.Substring(0, i));
                if (index > s1.Length) return x;
                int a = Convert.ToInt32(x.Substring(i + 1));                
                int b = Convert.ToInt32(s1[index - 1].Substring(i + 1));
                return a > b ? x : s1[index - 1];
            });
            foreach (string s in ie)
                Console.WriteLine(s);
            Console.ReadLine();
/*
1:12
2:12
3:15
*/
3分
static void Main(string[] args)
        {
            string[] s1=new string[]{"1:10","2:12"};
            string[] s2 = new string[] {"1:12", "2:10", "3:15"};

            Dictionary<int,int> dic=new Dictionary<int, int>();
            foreach (string s in s1)
            {
                string[] ss = s.Split("":"");
                int key = int.Parse(ss[0]);
                int value = int.Parse(ss[1]);

                dic.Add(key,value);
            }

            foreach (string s in s2)
            {
                string[] ss = s.Split("":"");
                int key = int.Parse(ss[0]);
                int value = int.Parse(ss[1]);

                int existValue = 0;
                if (dic.TryGetValue(key, out existValue))
                {
                    if (value>existValue)
                    {
                        dic.Remove(key);
                        dic.Add(key,value);
                    }
                }
                else
                {
                    dic.Add(key,value);
                }
            }

            foreach (KeyValuePair<int, int> pair in dic)
            {
                Console.WriteLine(pair.Key.ToString()+":"+pair.Value.ToString());
            }

            Console.ReadKey();
        }

真代码 呵呵

楼上用的转换为整数比较,我在想他原始的数据可能是时间,所以转换成TimeSpan的比较可能更简洁一些。
感谢回答,其实那个数字是金钱,呵呵。。。。。。。
3分
void Main()
{
	string[] s1=new string[]{"1:10","2:12"};
	string[] s2=new string[]{"1:12","2:10","3:15"};
   var query=from s in s1.Union(s2)  
             group s by s.Split("":"")[0] into g
			 select g.OrderByDescending(x=>int.Parse(x.Split("":"")[1])).FirstOrDefault();
	query.ToList().ForEach(q=>Console.WriteLine(q));
	/*
	1:12
	2:12
	3:15 
	*/
}

Linq都出来了 这个没用过比较难看懂
4楼8楼多分别多返回(字符串数组)ie.ToArray(),query.ToArray(),就完美了
3分
我负责逻辑分析,自己写代码,肯定代码量要小
分析:
1、定义一个新字符数组。用来存储比较的结果。
2、如果你已经知道哪个数组的元素个数最多,并且知道是多少个,那么可以直接写for循环,如果不知道先用程序比较出元素个数最多的数据个数是多少。
3.有了最多的元素个数后,写for循环,循环最大值为最大的元素个数。
内容,取第一个数据的第一个元素(可先判断,别数据越界),用“:”分隔保存,在取第二个数据的第一个元素,用“:”分隔保存,比较大小(可转换成整数比较,可能还有别的比较方法,自己研究就可)。
4、比较完成之后将大的那个数所属数组的第一个元素复制给上面定义的那个数组。
5、依次循环处理。
最后输出新数组。

3分

 string[] s1 = new string[] { "1:10", "2:12" };
        string[] s2 = new string[] { "1:12", "2:10", "3:15" };

        List<string[]> listStrings = new List<string[]>();
        listStrings.Add(s1);
        listStrings.Add(s2);

        Hashtable ht = new Hashtable();
        for (int j = 0; j < listStrings.Count; j++)
        {
            string[] nowStrings = listStrings[j];

            for (int i = 0; i < nowStrings.Length; i++)
            {
                string[] strs = nowStrings[i].Split("":"");
                int nowKey = int.Parse(strs[0]);
                int nowValue = int.Parse(strs[1]);

                if (ht[nowKey] != null)
                {
                    int oldValue = Convert.ToInt32(ht[nowKey]);
                    if (oldValue > nowValue)
                    {
                        nowValue = oldValue;
                    }
                }

                ht[nowKey] = nowValue;
            }
        }        

        foreach (DictionaryEntry de in ht)
        {
            Console.WriteLine(de.Key + ":" + de.Value);
        }

String.Join(",", s1.Concat(s2).GroupBy(value => value.Split("":"")[0]).Select(group => group.OrderByDescending(value => int.Parse(value.Split("":"")[1])).First()).ToArray())
看各位把linq用到如此地步
自愧不如啊
引用 12 楼 sbwwkmyd 的回复:

String.Join(“,”, s1.Concat(s2).GroupBy(value => value.Split(“”:””)[0]).Select(group => group.OrderByDescending(value => int.Parse(value.Split(“”:””)[1])).First()).ToArray())

复杂一点的,但是性能好一些

String.Join(",", s1.Concat(s2).Select(value => new KeyValuePair<string, string[]>(value, value.Split("":""))).Select(value => new KeyValuePair<string, KeyValuePair<int, string>>(value.Value[0], new KeyValuePair<int, string>(int.Parse(value.Value[1]), value.Key))).GroupBy(value => value.Key).Select(group => group.OrderByDescending(value => value.Value.Key).First().Value.Value).ToArray())
3分
用匿名类的话,效率还会好一些。最大的问题是Max不太好用,否则不用OrderByDescending与First就差不多了。

            String.Join(",", s1.Concat(s2).Select(value =>
            {
                string[] values = value.Split("":"");
                return new
                {
                    value = value,
                    key = values[0],
                    intValue = int.Parse(values[1])
                };
            }).GroupBy(value => value.key).Select(group => group.OrderByDescending(value => value.intValue).First().value).ToArray());
3分
引用 7 楼 zhzivy 的回复:

感谢回答,其实那个数字是金钱,呵呵。。。。。。。

既然是货币,那就应该用货币的方式进行

string[] s1 = new string[] { "1:10", "2:12" };
string[] s2 = new string[] { "1:12", "2:10", "3:15" };

// 准备一个本地化的数字格式化器
NumberFormatInfo format = new CultureInfo("en-US", false).NumberFormat;
// 货币小数符号为:,小数位2位
format.CurrencyDecimalDigits = 2;
format.CurrencyDecimalSeparator = @":";
format.CurrencySymbol = string.Empty;

List<string> listDecimal = s1.Union(s2)
	.Select(s => decimal.Parse(s, NumberStyles.Currency, format))
	.GroupBy(d => (int) d)
	.Select(g => g.Max().ToString("c", format))
	.ToList<string>();

之前以为是时间比较,于是有了这个版本:

// TimeSpan的自定义输出格式比较麻烦,就用了DateTime
List<string> listTime = s1.Union(s2)
	.Select(s => DateTime.Parse(s))
	.GroupBy(t => t.Hour)
	.Select(g => g.Max().ToString("h:m"))
	.ToList<string>();

3分
感觉这样应该可以,直接取每个数组里面的元素比较

//可以先判断下count1和count2的大小在进行for循环(我的判断不全)
            string[] s1=new string[]{"1:10","2:12"};
            string[] s2=new string[]{"1:12","2:10","3:15"};
            int count1=s1.Length;
            int count2 = s2.Length;
            string[] a=new string[count2];
            for (int i = 0; i < count2; i++)
            {
                if (i < count1)
                {
                    if (s1[i].CompareTo(s2[i]) > 0)
                    {
                        a[i] = s1[i];
                    }
                    else
                    {
                        a[i] = s2[i];
                    }
                }
                else
                {
                    a[i] = s2[i];
                }
            }

感觉这样可行

 

            string[] s1=new string[]{“1:10″,”2:12”};
            string[] s2=new string[]{“1:12″,”2:10″,”3:15”};

            Hashtable ss1 = new Hashtable();
            Hashtable ss2 = new Hashtable();
            for (int i = 0; i < s1.Length; i++)
            {
                string[] str = s1[i].Split(“”:””);
                ss1.Add(str[0],str[1]);
            }

            for (int i = 0; i < s2.Length; i++)
            {
                string[] str = s2[i].Split(“”:””);
                if (ss1.Count> i+1 && int.Parse(ss1[str[0]].ToString()) > int.Parse(str[1]))
                    ss2.Add(str[0], ss1[str[0]]);
                else
                    ss2.Add(str[0], str[1]);

            }

            return ss2;

代码怎么插入。。。。
linq是3.5以上才有的,楼主要是2.0的你们白忙乎了,所以还是我的那个适用。
个人意见:
无论是否使用LINQ,既然要筛选的目标其实是对应货币的字符串,就应该用货币的方式解决之,单纯的字符串拼接对代码的可阅读性没有益处。
3分
18楼的代码有点小问题,已经修改了。
string[] s1=new string[]{“1:10″,”2:12”};
            string[] s2=new string[]{“1:12″,”2:10″,”3:15”};

            Hashtable ss1 = new Hashtable();
            Hashtable ss2 = new Hashtable();
            for (int i = 0; i < s1.Length; i++)
            {
                string[] str = s1[i].Split(“”:””);
                ss1.Add(str[0],str[1]);
            }

            for (int i = 0; i < s2.Length; i++)
            {
                string[] str = s2[i].Split(“”:””);
                if (ss1.Count > i && int.Parse(ss1[str[0]].ToString()) > int.Parse(str[1]))
                {
                    ss2.Add(str[0], ss1[str[0]]);
                }
                else
                {
                    ss2.Add(str[0], str[1]);
                }
            }
  return ss2;

感谢各位的解答,问题解决,linq小弟不太懂 改天研究下,分不多 都分点吧 辛苦了! 

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明字符数组中数字大小判断问题?急
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!