2012-02-24 55 views
1

我做了一個程序,用戶輸入儘可能多的名字,如他們喜歡的名字,中間首字母(可選)和姓氏格式。然後分割名稱並將它們分配給名爲firstName,middleInitial和lastName的字符串變量。由於可能有多個名稱輸入,我已將每個變量添加到其自己的名爲fName,mI和lName的arrayList。現在我必須對它們進行分類,以便按姓氏從小到大排序。這裏是問題出現的地方。很容易對姓氏排序,但是如何讓mI和fName arrayLists按照與lName arrayList相同的順序進行排序?這裏是我的代碼:如何同步排序的三個arrayLists

static void Main(string[] args) 
{ 
    ArrayList fName = new ArrayList(); 
    ArrayList mI = new ArrayList(); 
    ArrayList lName = new ArrayList(); 


    Console.WriteLine("Please enter name: " + "(type quit to exit)"); 
    string inValue = Console.ReadLine(); //prime Readline 

    while (inValue != "quit") 
    { 
     string firstName = "", 
       middleInitial = "", 
       lastName = ""; 


     string[] name = inValue.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
     firstName = name[0]; 
     fName.Add(firstName); 

     if (name.Length > 2) 
     { 
      middleInitial = name[1]; 
      mI.Add(middleInitial); 

     } 
     else 
     { 
      middleInitial = string.Empty; 
      mI.Add(middleInitial); 
     } 
     if (name.Length == 2) 
     { 
      lastName = name[1]; 
      lName.Add(lastName); 
     } 
     else 
     { 
      lastName = string.Join(" ", name.Skip(2)); 
      lName.Add(lastName); 
     } 
     Console.WriteLine("Please enter name: " + "(type quit to exit)"); 
     inValue = Console.ReadLine(); 
    } 
} 
+2

這功課嗎?沒有實際的理由,否則保留單獨的名單。 – Yuck 2012-02-24 03:47:45

+0

並沒有理由使用'ArrayList'。改爲使用'List '。 – 2012-02-24 03:52:35

+0

我會研究。這本書提到它,但這就是它。 – 2012-02-24 03:59:30

回答

1

不要使用3個列表。使用1個列表,其元素包含名字,中間名和姓氏,並執行IComparable,以便按照姓氏第一個(和,然後通過第一個和可能的中間名)完成排序。

或者,如果您提供適當的IComparerList.Sort,則元素不需要執行IComparable

你可以很容易地將這個列表分成3個列表,如果你願意,之後排序。

+0

我不一定需要3個列表。我做了三個列表,因爲我無法弄清楚如何將名字,中間首字母(可選),姓氏字符串變成姓氏,名字,中間初始字符串。我會更多地研究它。 – 2012-02-24 03:57:31

1

創建一個類UserName包含3個字段:fName,mName,lName。 public class UserName { public string fName,mName,lName; } 不是將數據存儲到3個數組中,而是將數據存儲到1個ArrayList中。

class Program 
    { 
     static void Main(string[] args) 
     { 
       List<Username> usernames = new ArrayList<Username>(); 
     } 
    } 

當用戶輸入名字,中間名,姓氏時,創建新的用戶名對象並將其存儲到ArrayList中。

usernames.add(new Username { 
fName = firstName, 
mName = middleName, 
lName = lastName} 
); 

排序此ArrayList: - 創建IComparable的對象進行排序(通過FNAME或L-NAME)。上的ArrayList

public class sortByFNameHelper : IComparer 
{ 
    int IComparer.Compare(object a, object b) 
    { 
     UserName u1=(UserName)a; 
     UserName u2=(UserName)b; 
     if (u1.fName > u2.fName) 
     return 1; 
     if (u1.fName < u2.fName) 
     return -1; 
     else 
     return 0; 
    } 
} 
  • 呼叫類別:

    的IComparer compareByFName =新sortByFNameHelper(); usernames.sort(compareByFName);

HTH。

2

使用單個列表而不是3個。爲此,您需要一個數據結構,將第一個,中間和最後一個名稱封裝到一個類中。

public class Name 
{ 
    public string First { get; set; } 
    public string Middle { get; set; } 
    public string Last { get; set; } 
} 

而不是使用ArrayList使用List<T>,而不是和。接下來使用LINQ爲您進行排序。

var list = new List<Name>(); 
list.Add(new Name { First = "Brian", Middle = "D", Last = "Gideon" }); 
list.Add(new Name { First = "Bart", Middle = "", Last = "Simpson" }); 
list.Add(new Name { First = "Captain", Middle = "", Last = "America" }); 
var ordered = list.OrderBy(x => x.Last).ThenBy(x => x.First).ThenBy(x => x.Middle); 
foreach (Name item in ordered) 
{ 
    Console.WriteLine(item.Last + ", " + item.First + " " + item.Middle); 
}