2016-03-01 134 views
2

因此,标题已经暗示我只想知道是否可以通过也包含在这些字符串中的数字对字符串数组中的元素进行排序。如何排序包含数字的字符串数组,数字

在我的计划,我已经能够阅读这些奠定了这样一个文件的内容:

Adele got 2,Jack got 8 

我已经这才得以通过逗号分割这个文件放到一个字符串数组叫名字:

Dim fileReader As System.IO.StreamReader 
     Dim line As String 
     fileReader = My.Computer.FileSystem.OpenTextFileReader(ClassA) 
     line = fileReader.ReadLine 
     names = line.Split(",") 
     For Each element As String In names 
      Array.Sort(names) 
      Console.WriteLine(element) 
     Next 

我还能够按字母顺序给出的输出文件进行排序:

Adele got 2 
Jack got 8 

但是我想知道的是,它是否是或不是可能的,基于数这些字符串所以输出看起来像排序:

Jack got 8 
Adele got 2 

我使用正则表达式来提取数字也认为,解析它们为整数,将它们保存到一个变量,然后将它们添加到一个数组和比较的阵列,但他们必须有一个简单的方法d:

任何帮助,非常感谢你们:)

+0

您可以在实施对象传递IComparer到排序方法。这可以让你做任何自定义逻辑来确定如何安排结果。但是,您希望在“For Each”位之外执行此类操作。 –

回答

1

Linq来救援。我添加到数据,以确保它会处理2位数字,并由于2个元素是一个软弱的测试:

Dim phrases As String() = {"Adele got 2", "Zalgo got 9", "Jack got 8", "Ziggy got 11"} 

phrases = phrases.OrderByDescending(Function(q) Int32.Parse(q.Split(" ").Last)).ToArray() 

For Each s In phrases 
    Console.WriteLine(s) 
Next 

结果:

Ziggy got 11 
Zalgo got 9 
Adele got 8 
Jack got 2 
0

是的,这是可能的。添加一个比较器函数,然后使用它进行排序。这是比较器:

Private Shared Function WhoGotComparer(ByVal x As String, ByVal y As String) As Integer 
    Dim parseX() As String = Split(x, " got ") 
    Dim parseY() As String = Split(y, " got ") 
    If parseX.Length <> 2 Or parseY.Length <> 2 Then Return 0 
    Return CInt(parseY(1)).CompareTo(CInt(parseX(1))) 'Performs an integer comparison. 
End Function 

将它添加到您的代码中。你可以这样使用它:

names.Sort(AddressOf WhoGotComparer) 

这应该导致数组按降序排列。我认为这就是你想要的例子。如果要将顺序更改为升序,则可以在比较器函数中反转它们的x和y参数的角色,也可以否定比较的结果。