c#实现自然排序效果,按1,2,11而不是1,11,12,区分字母文字和数字

排序有时候要考虑后缀。这样看起来比较自然。

参考了codeproject上一篇文章:http://www.codeproject.com/Articles/22978/Implementing-the-NET-IComparer-interface-to-get-a

然后自己写了个简单的,考虑到主要思想是上面那个文章上的,所以不做太多解释。代码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StringOrder
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] array = new string[] { "序列11", "序列11s", "序列12", "序列1", "序列12s", "序列1s", "序列22s", "序列2", "序列3", "序列2w", "序列2q", "序列22r", "23r", "22r", "22", "2", "32", "42", "12", "1" };

            string[] array2 = array.OrderBy(a => a, new StringCompare1()).ToArray();
            Console.Read();
        }
    }
    public class StringCompare1 : IComparer<string>
    {
        public int Compare(string x, string y)
        {

            StringParser sx = new StringParser(x);
            StringParser sy = new StringParser(y);
            while (sx.TokenType != StringParser.ETokenType.Nothing || sy.TokenType != StringParser.ETokenType.Nothing)
            {
                if (sx.TokenType == StringParser.ETokenType.Numberic && sy.TokenType == StringParser.ETokenType.Numberic)
                {
                    return (int)(sx.DoubleValue - sy.DoubleValue);
                }
                if (string.Compare(sx.StringValue, sy.StringValue) != 0)
                {
                    return string.Compare(sx.StringValue, sy.StringValue);
                }
                else
                {
                    sx.NextToken();
                    sy.NextToken();
                }
            }
            return 0;
        }
    }

    public class StringParser
    {
        private string _value;
        private char _curChar;
        private int _curIndex = 0;
        private int _length;
        private ETokenType _tokenType = ETokenType.Character;
        public ETokenType TokenType { get { return _tokenType; } }

        private string _stringValue;
        public string StringValue { get { return _stringValue; } }

        private double _doubleValue;
        public double DoubleValue { get { return _doubleValue; } }

        public StringParser(string val)
        {
            _value = val;
            _length = val.Length;
            NextChar();
            NextToken();
        }

        public void NextToken()
        {
            if (_curChar == ‘\0‘)
            {
                _tokenType = ETokenType.Nothing;
                _stringValue = null;
            }
            else if (char.IsDigit(_curChar))
            {
                int startIndex = _curIndex;
                while (char.IsDigit(_curChar) || _curChar == ‘.‘)
                {
                    NextChar();
                }
                string temp = _value.Substring(startIndex-1, _length - startIndex+1);
                if (double.TryParse(temp, out _doubleValue))
                {
                    _tokenType = ETokenType.Numberic;
                }
                else
                {
                    _tokenType = ETokenType.Character;
                }
                _stringValue = temp;
            }
            else if (char.IsLetter(_curChar))
            {
                _tokenType = ETokenType.Character;
                int startIndex = _curIndex;
                while (char.IsLetter(_curChar))
                {
                    NextChar();
                }
                _stringValue = _value.Substring(startIndex-1,_curIndex-startIndex);
            }
            else
            {
                NextChar();
            }
        }

        private void NextChar()
        {
            if (_curIndex >= _length)
            {
                _curChar = ‘\0‘;
                return;
            }
            else
            {
                _curChar = _value[_curIndex];
                _curIndex += 1;
            }

        }
        public enum ETokenType
        {
            Nothing,
            Character,
            Numberic,
        }
    }
}
时间: 2024-08-02 05:34:19

c#实现自然排序效果,按1,2,11而不是1,11,12,区分字母文字和数字的相关文章

TreeSet联系 自然排序

****************************************************** 创建需要的两个类 package com.hu.treeset; public class MyDate { private int day; private int month; private int year; public int getDay() { return day; } public void setDay(int day) { this.day = day; } pu

Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序)

1. TreeSet存储自定义对象并遍历练习1(自然排序): (1)Student.java: 1 package cn.itcast_05; 2 3 /* 4 * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 5 */ 6 public class Student implements Comparable<Student> { 7 private String name; 8 private int age; 9 10 public Student() { 11 super

Java基础知识强化之集合框架笔记46:Set集合之TreeSet存储自定义对象并遍历练习2(自然排序)

1. TreeSet存储自定义对象并遍历练习2: (1)Student.java 1 package cn.itcast_06; 2 3 /* 4 * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 5 */ 6 public class Student implements Comparable<Student> { 7 private String name; 8 private int age; 9 10 public Student() { 11 super(); 12

Java基础知识强化之集合框架笔记44:Set集合之TreeSet保证元素唯一性和自然排序的原理和图解

1. TreeSet保证元素唯一性和自然排序的原理和图解

分治算法——合并排序与自然排序

合并排序算法: public class MergeSort { public static void MergeSort(int A[],int low,int high){ if(low<high){ int middle=(low+high)/2; MergeSort(A,low,middle); MergeSort(A,middle+1,high); Merge(A,low,middle,high); } } public static void Merge(int A[],int lo

MongoDB自然排序

MongoDB自然排序 名词解释 natural order    该排序下数据库参照文档在磁盘上的存储顺序.这是默认的排序顺序. ObjectId    一个特定的12字节BSON类型,用于保证集合中的唯一性.ObjectId基于timestamp.machine ID.process ID和 a process-local incremental counter产生.MongoDB使用ObjectId值作为_id键的默认值. _id 和 ObjectId 当集合创建的时候,MongoDB在_

Lucene中使用Score进行自然排序

/* *这里是使用Lucene进行相关度排序 *使用Score进行自然排序 *相关度排序是一种最简单的排序方式. *所谓相关度,其实是文档的得分 *文档的得分在每次查找的时候都不同, *需要根据查找的关键字来确定. * *tf词条频率 *idf反转文档频率 *boost Field的激励因子 *LengthNum长度因子  */ 结果图: package score; import java.io.IOException; import org.apache.lucene.analysis.st

TreeSet集合的add()方法源码解析(01.Integer自然排序)

>TreeSet集合使用实例 >TreeSet集合的红黑树 存储与取出(图) >TreeSet的add()方法源码     TreeSet集合使用实例 package cn.itcast_05; import java.util.TreeSet; /* * TreeSet:能够对元素按照某种规则进行排序. * 排序有两种方式 * A:自然排序 * B:比较器排序 * * TreeSet集合的特点:排序和唯一 * * 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的

TreeSet的自然排序(自定义对象 compareTo方法)

>要实现自然排序,对象集合必须实现Comparable接口,并重写compareTo()方法 >一般需求中描述的是"主要条件",如:按姓名长度排序.  需注意次要条件 如:长度相同时,姓名内容,年龄等条件是否相等,这决定着是否存入TreeSet集合.   package cn.itcast.day21.treeset; /* * 要实现自然排序,就一定要实现Comparable接口,并重写compareTo()方法 * * 若不实现Comparable接口,而把对象往Tre