View Full Version : sort کردن ArrayList بر حسب String[] ؟
harani
دوشنبه 25 فروردین 1393, 09:05 صبح
سلام دوستان من یک ArrayList<String> دارم که تعدادی عناضر در اون هستش چگونه میتوانم آن را بر حسب String[] سرت کنم :
به عبارت دیگر
ArrayList <String>
شامل مقادیر
{"2 روز","1 روز","4 هفته","2 هفته","1 هفته","3 هفته","4 ماه","3 ماه","2 ماه","بیش از 5 ماه"}
یا یکی دیگه شامل مقادیر
{"1 روز","4 هفته","3 هفته","4 ماه","بیش از 5 ماه","2 ماه"}
میخوام مقادیر فوق بر حسب String[] زیر
{"1 روز","2 روز","1 هفته","2 هفته","3 هفته","4 هفته","2 ماه","3 ماه","4 ماه","بیش از 5 ماه"}
sort بشن آیا چنین کاری ممکن است یا خیر ?
من از compare خود جاوا به نتیجه ای نرسیدم
rubiks.kde
دوشنبه 25 فروردین 1393, 09:13 صبح
-باید تابع compare رو خودتون بنویسید :
Collections.sort(list, new Comparator<String>() { @Override
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
} });
-اگه اطلاعاتتون ثابته و تغییر نمیکنه از همون اول ، همون طور که مخواهید وارد لیست کنید تا نیاز به sort نباشه.
harani
دوشنبه 25 فروردین 1393, 09:21 صبح
ممنون ولی همونطور که گفتم مقادیر من ثابت نیست چرا که من مقادیر مختلفی را از دیتابیس میخوانم و در arraylist میریزم در توضیحاتی که بیان کردم هم دو نوع مختلف arraylist را نوشتم
من این موضوع هم بیان کردم که از از compare خود جاوا به نتیجه ای نرسیدم چرا که نتیجه ای که به من برمیگرداند به صورت زیر بود .
{"1 روز","1 هفته","2 روز","2 هفته","2 ماه","3 هفته","3 ماه","4 هفته","4 ماه","بیش از 5 ماه"}
که با
{"1 روز","2 روز","1 هفته","2 هفته","3 هفته","4 هفته","2 ماه","3 ماه","4 ماه","بیش از 5 ماه"}
در تضاد است .
poorman
دوشنبه 25 فروردین 1393, 09:35 صبح
دستوری که از sql میخونید رو order کنید تا مرتب بشه
اینجا توضیح دادم
http://barnamenevis.org/showthread.php?448016-%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%A7%D8%B2-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%A8%D8%B1-%D8%A7%D8%B3%D8%A7%D8%B3-%D8%AD%D8%B1%D9%88%D9%81-%D8%A7%D9%84%D9%81%D8%A8%D8%A7&p=2004329&viewfull=1#post2004329
harani
دوشنبه 25 فروردین 1393, 10:05 صبح
متاسفانه از order هم جوابی نگرفتم چرا که میاد برحسب اعداد ابتدای کلمات مرتبط میکنه ولی مرتب سازی به شکل زیر است .
{"1 روز","2 روز","1 هفته","2 هفته","3 هفته","4 هفته","2 ماه","3 ماه","4 ماه","بیش از 5 ماه"}
همانطور که میبینید کاری به اعداد به جهت مرتبط سازی نداریم .
poorman
دوشنبه 25 فروردین 1393, 10:50 صبح
من نمیدونم دقیقا استفاده شما در چه موردی هست، ولی پیشنهادم اینه که اگر مقادیر ثابت هستن اونا رو به صورت زمان و عددی ذخیره کنید ( مثلا ساعت یا روز )
بعد وقتی اطلاعات رو از دیتابیس میخونید خیلی ساده order میکنید و با استفاده از یک تابع که خودتون مینویسید، اون زمان رو تبدیل به رشته میکنید
harani
دوشنبه 25 فروردین 1393, 11:18 صبح
ممنون ولی من از order استفاده میکنم به نتیجه ای نرسیدم ام .
order به اینصورت مرتب میکنه => {"1 روز","1 هفته","2 روز","2 هفته","2 ماه","3 هفته","3 ماه","4 هفته","4 ماه","بیش از 5 ماه"}
ولی من چنین چیزی میخوام = > {"1 روز","2 روز","1 هفته","2 هفته","3 هفته","4 هفته","2 ماه","3 ماه","4 ماه","بیش از 5 ماه"}
poorman
دوشنبه 25 فروردین 1393, 12:27 عصر
متوجه منظور شما شدم دوست عزیز
واسه حل این مشکل پیشنهاد دادم به جای اینکه توی دیتابیس ذخیره کنید "1 روز" بنویسید 1، و به جای "1 هفته" عدد 7 رو ذخیره کنید
بعدش این اعداد رو از دیتابیس مرتب شده بخونید و تبدیل کنید
مثلا اگر عدد کوچکتر از 7 بود رشته عدد + " روز" توی لیست قرار بگیره
و ...
امیدوارم متوجه منظورم شده باشید
راه حل دیگه اینه که شما کلا بیاید یک تابع مرتب سازی بر اساس چیزی که میخواید بنویسید که فکر نمیکنم آسون تر باشه
rubiks.kde
دوشنبه 25 فروردین 1393, 12:36 عصر
ممنون ولی همونطور که گفتم مقادیر من ثابت نیست چرا که من مقادیر مختلفی را از دیتابیس میخوانم و در arraylist میریزم در توضیحاتی که بیان کردم هم دو نوع مختلف arraylist را نوشتم
من این موضوع هم بیان کردم که از از compare خود جاوا به نتیجه ای نرسیدم چرا که نتیجه ای که به من برمیگرداند به صورت زیر بود .
{"1 روز","1 هفته","2 روز","2 هفته","2 ماه","3 هفته","3 ماه","4 هفته","4 ماه","بیش از 5 ماه"}
که با
{"1 روز","2 روز","1 هفته","2 هفته","3 هفته","4 هفته","2 ماه","3 ماه","4 ماه","بیش از 5 ماه"}
در تضاد است .
تابع compare رو دوباره بنویس البته اگه ساختار تمام String هات همینه (مثلا عدد + اسپیس + روز|ماه|هفته|سال) اون وقت بیا داخل تابع compare عدد رو از اون رشته جدا کن.
حالا ببین رشته چیه مثلا اگه هفتس و یکی روز خوب اول رشته ایی که توش روز داره بزرگ تر هست و اول باید اون بیاد یا مثلا هر دو رشته ماه بودن اون وقت عدد رو ببین که کدوم کوچکتره پس اون اول باید بیاد.
این روش کاملا جواد میده به شرطی که تمام رشته هات همون ساختاری رو داشته باشه که توی بالا گفتم
Mojtaba.Shateri
دوشنبه 25 فروردین 1393, 16:50 عصر
سلام دوستان من یک ArrayList<String> دارم که تعدادی عناضر در اون هستش چگونه میتوانم آن را بر حسب String[] سرت کنم :
به عبارت دیگر
ArrayList <String>
شامل مقادیر
{"2 روز","1 روز","4 هفته","2 هفته","1 هفته","3 هفته","4 ماه","3 ماه","2 ماه","بیش از 5 ماه"}
یا یکی دیگه شامل مقادیر
{"1 روز","4 هفته","3 هفته","4 ماه","بیش از 5 ماه","2 ماه"}
میخوام مقادیر فوق بر حسب String[] زیر
{"1 روز","2 روز","1 هفته","2 هفته","3 هفته","4 هفته","2 ماه","3 ماه","4 ماه","بیش از 5 ماه"}
sort بشن آیا چنین کاری ممکن است یا خیر ?
من از compare خود جاوا به نتیجه ای نرسیدم
این کد رو نوشتم ، ببینید مشکلتون حل میشه یا خیر :
private void button1_Click(object sender, EventArgs e)
{
var items = new List<Tuple<int, string>>()
{
new Tuple<int, string>(1, "روز"),
new Tuple<int, string>(2, "هفته"),
new Tuple<int, string>(3, "ماه"),
new Tuple<int, string>(4, "سال"),
new Tuple<int, string>(5,"غیره")
};
var rep = new string[]
{
"2 روز",
"1 هفته",
"1 روز",
"4 هفته",
"3 هفته",
"3 ماه",
"2 هفته",
"2 ماه",
"بیش از 5 ماه",
"4 ماه"
};
var all = new List<Tuple<int, string>>();
string ect = string.Empty;
foreach (var item in rep)
{
var sep = getWeekItems(item);
if (sep != null)
{
all.Add(sep);
}
else
{
ect = item;
}
}
var list =( from m in items
from n in all
where m.Item2 == n.Item2
select new { Number = n.Item1 ,Title = n.Item2}).ToList();
all = new List<Tuple<int, string>>();
foreach (var v in list.Select(x => x.Title).Distinct())
{
var test = new List<Tuple<int, string>>();
foreach (var w in list)
{
if (v == w.Title)
{
test.Add(new Tuple<int, string>(w.Number, v));
}
}
all.AddRange(test.Where(x => x.Item2 == v).OrderBy(b => b.Item1).ToList());
}
List<string> endSorted = all.Select(x => x.Item1 + " " + x.Item2).ToList();
endSorted.Add(ect);
}
private Tuple<int, string> getWeekItems(string weekName)
{
int i;
string _weekEnd = string.Empty;
string number = string.Empty;
try
{
for (i = 0; i < weekName.Length; i++)
{
if (char.IsDigit(weekName[i]))
{
number = string.Concat(weekName[i], number);
}
else
{
break;
}
}
_weekEnd = weekName.Substring(i, weekName.Length - i);
return new Tuple<int, string>(int.Parse(number.Trim()), _weekEnd.Trim());
}
catch (Exception ex)
{
return null;
}
}
Mojtaba.Shateri
دوشنبه 25 فروردین 1393, 16:52 عصر
سلام دوستان من یک ArrayList<String> دارم که تعدادی عناضر در اون هستش چگونه میتوانم آن را بر حسب String[] سرت کنم :
به عبارت دیگر
ArrayList <String>
شامل مقادیر
{"2 روز","1 روز","4 هفته","2 هفته","1 هفته","3 هفته","4 ماه","3 ماه","2 ماه","بیش از 5 ماه"}
یا یکی دیگه شامل مقادیر
{"1 روز","4 هفته","3 هفته","4 ماه","بیش از 5 ماه","2 ماه"}
میخوام مقادیر فوق بر حسب String[] زیر
{"1 روز","2 روز","1 هفته","2 هفته","3 هفته","4 هفته","2 ماه","3 ماه","4 ماه","بیش از 5 ماه"}
sort بشن آیا چنین کاری ممکن است یا خیر ?
من از compare خود جاوا به نتیجه ای نرسیدم
این کد رو نوشتم ، ببینید مشکلتون حل میشه یا خیر :
خروجی sort شده در endSorted است.
private void button1_Click(object sender, EventArgs e)
{
var items = new List<Tuple<int, string>>()
{
new Tuple<int, string>(1, "روز"),
new Tuple<int, string>(2, "هفته"),
new Tuple<int, string>(3, "ماه"),
new Tuple<int, string>(4, "سال"),
new Tuple<int, string>(5,"غیره")
};
var rep = new string[]
{
"2 روز",
"1 هفته",
"1 روز",
"4 هفته",
"3 هفته",
"3 ماه",
"2 هفته",
"2 ماه",
"بیش از 5 ماه",
"4 ماه"
};
var all = new List<Tuple<int, string>>();
string ect = string.Empty;
foreach (var item in rep)
{
var sep = getWeekItems(item);
if (sep != null)
{
all.Add(sep);
}
else
{
ect = item;
}
}
var list =( from m in items
from n in all
where m.Item2 == n.Item2
select new { Number = n.Item1 ,Title = n.Item2}).ToList();
all = new List<Tuple<int, string>>();
foreach (var v in list.Select(x => x.Title).Distinct())
{
var test = new List<Tuple<int, string>>();
foreach (var w in list)
{
if (v == w.Title)
{
test.Add(new Tuple<int, string>(w.Number, v));
}
}
all.AddRange(test.Where(x => x.Item2 == v).OrderBy(b => b.Item1).ToList());
}
List<string> endSorted = all.Select(x => x.Item1 + " " + x.Item2).ToList();
endSorted.Add(ect);
}
private Tuple<int, string> getWeekItems(string weekName)
{
int i;
string _weekEnd = string.Empty;
string number = string.Empty;
try
{
for (i = 0; i < weekName.Length; i++)
{
if (char.IsDigit(weekName[i]))
{
number = string.Concat(weekName[i], number);
}
else
{
break;
}
}
_weekEnd = weekName.Substring(i, weekName.Length - i);
return new Tuple<int, string>(int.Parse(number.Trim()), _weekEnd.Trim());
}
catch (Exception ex)
{
return null;
}
}
harani
چهارشنبه 27 فروردین 1393, 23:40 عصر
این کد رو نوشتم ، ببینید مشکلتون حل میشه یا خیر :
خروجی sort شده در endSorted است.
private void button1_Click(object sender, EventArgs e)
{
var items = new List<Tuple<int, string>>()
{
new Tuple<int, string>(1, "روز"),
new Tuple<int, string>(2, "هفته"),
new Tuple<int, string>(3, "ماه"),
new Tuple<int, string>(4, "سال"),
new Tuple<int, string>(5,"غیره")
};
var rep = new string[]
{
"2 روز",
"1 هفته",
"1 روز",
"4 هفته",
"3 هفته",
"3 ماه",
"2 هفته",
"2 ماه",
"بیش از 5 ماه",
"4 ماه"
};
var all = new List<Tuple<int, string>>();
string ect = string.Empty;
foreach (var item in rep)
{
var sep = getWeekItems(item);
if (sep != null)
{
all.Add(sep);
}
else
{
ect = item;
}
}
var list =( from m in items
from n in all
where m.Item2 == n.Item2
select new { Number = n.Item1 ,Title = n.Item2}).ToList();
all = new List<Tuple<int, string>>();
foreach (var v in list.Select(x => x.Title).Distinct())
{
var test = new List<Tuple<int, string>>();
foreach (var w in list)
{
if (v == w.Title)
{
test.Add(new Tuple<int, string>(w.Number, v));
}
}
all.AddRange(test.Where(x => x.Item2 == v).OrderBy(b => b.Item1).ToList());
}
List<string> endSorted = all.Select(x => x.Item1 + " " + x.Item2).ToList();
endSorted.Add(ect);
}
private Tuple<int, string> getWeekItems(string weekName)
{
int i;
string _weekEnd = string.Empty;
string number = string.Empty;
try
{
for (i = 0; i < weekName.Length; i++)
{
if (char.IsDigit(weekName[i]))
{
number = string.Concat(weekName[i], number);
}
else
{
break;
}
}
_weekEnd = weekName.Substring(i, weekName.Length - i);
return new Tuple<int, string>(int.Parse(number.Trim()), _weekEnd.Trim());
}
catch (Exception ex)
{
return null;
}
}
ممنون دوست گرامی اما من با xamarin کدم رو نمی نویسم با جاوا است فکر کنم راه حل جناب poorman (http://barnamenevis.org/member.php?295320-poorman) بهترین راه هستش .
Mojtaba.Shateri
پنج شنبه 28 فروردین 1393, 13:38 عصر
ممنون دوست گرامی اما من با xamarin کدم رو نمی نویسم با جاوا است فکر کنم راه حل جناب poorman (http://barnamenevis.org/member.php?295320-poorman) بهترین راه هستش .
خواهش میکنم . فرقی نداره و میشه با جاوا نوشت. با این فرض این راه حل رو دادم که دیتای شما در دیتابیس هست و شما فقط باید بر اساس اونها کار کنید.
اگه شما بتونید اطلاعات دیتابیس ر عوض کنید ، 100% راه حل Poorman بهتره.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.