如何对输入的指定个数的字符串进行按字典序排序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何对输入的指定个数的字符串进行按字典序排序?相关的知识,希望对你有一定的参考价值。

输入一定数量的字符串,然后按字典序排序。例如,
10
tiny
2short4me
very_long_file_name
shorter
size-1
size2
size3
much_longer_name
12345678.123
mid_size_name
应输出
12345678.123
2short4me
mid_size_name
much_longer_name
shorter
size-1
size2
size3
tiny
very_long_file_name

字符串比较函数strcmp(字符串1,字符串2)
把字符串1和字符串2进行逐个字母比较
如果1>2返回整数
1<2返回负数
1==2返回0
参考技术A 呵呵。
10
tiny
2short4me
very_long..
shorter
size-1
size-2
size3
much
123456
mid_size_name
^Z //读文件的话就把cin换成输入流,判断标准换成!ifs.eof(),控制台输入就用Ctrl+Z来结束。

10
123456
2short4me
mid_size_name
much
shorter
size-1
size-2
size3
tiny
very_long..
请按任意键继续. . .

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main()

vector< string > vec;
string tmp;
while( !cin.fail() )

getline( cin,tmp );
vec.push_back( tmp );


sort( vec.begin(),vec.end() );

copy( vec.begin(),vec.end(),ostream_iterator< string >( cout, "\n" ) );

return 0;
参考技术B 用ecxl表格可以轻松完成这个排序。 参考技术C 直接采用冒泡排序法,比较确定字符的ascII码,就可以了。‘A’->'Z'的ASCII码是65->90,而‘a’->‘z’是97->122.可以通过ASCII码进行大小写转换,和排序 参考技术D 1. 有N个学生,每个学生的数据包括学号、姓名、性别,年龄,班级、C语言成绩。从键盘输入N 个学生数据,要求打印出最高分的学生信息以及不及格学生的信息要求:
(1)定义学生结构体。
(2)用一个函数实现N 个学生数据的输入;
(3) 用一个函数实现N个学生数据的输出;
(4) 用一个函数完成返回C语言成绩最高及最低人的信息。
(5) 在主函数中显示(4)的信息。
(6) 打印优秀及不及格同学的信息
void Main()

string[] fileList =new string[] "list_1.htnl","list_10.html","list_100.html","list_111.html","list_109.html","list_11.html";
fileList= fileList.OrderBy(s =>int.Parse( Regex.Match(s, @"\d+").Value)).ToArray();
foreach (string s in fileList)

Console.WriteLine(s);



/*
结果:
list_1.htnl
list_10.html
list_11.html
list_100.html
list_109.html
list_111.html

/*

如何按字典顺序对 ArrayList 进行排序?

【中文标题】如何按字典顺序对 ArrayList 进行排序?【英文标题】:How do I sort an ArrayList lexicographically? 【发布时间】:2011-03-01 06:12:46 【问题描述】:

我正在尝试对表示卡片值的字符串数组列表进行排序。因此,有些卡片包含字母(“King”),而有些卡片包含仅包含数字(“7”)的字符串。我知道使用 Collections.sort,但它只对包含字母的字符串进行排序。如何让 ArrayList 按数字和字母顺序排序?

编辑:对不起,我看排序的时候一定没有太注意。排序工作正常,我一定是被 10 排在 2 之前的事实吓倒了。谢谢

【问题讨论】:

“我知道使用 Collections.sort,但它只对包含字母的字符串进行排序”呃? 不确定您要做什么,对集合进行排序会按字母顺序对所有内容(包括“7”)进行排序。数字放在 A 之前,因此它们最终会排在最前面。如果您希望 7 存储在“s”下,则必须使用 Generic Collections 字典类之类的内容创建一个字典,该类具有显示字符串“7”以及代码/文本表示“Seven”,或类似那个。 【参考方案1】:

不,Collections.sort 将使用 Unicode 序数词典比较对所有内容进行排序,因为这是 String.compareTo 的行为。 “7”在“King”之前,“10”在“2”之前。

【讨论】:

是的 - java.sun.com/j2se/1.4.2/docs/api/java/lang/…【参考方案2】:

我知道使用 Collections.sort,但它只对包含字母的字符串进行排序。如何让 ArrayList 按数字和字母顺序排序?

如果字符串是一个数字,它已经被排序(虽然是一个字符串)看看:

import java.util.*;
class Sort 
    public static void main( String [] args  ) 
        List list = Arrays.asList("Kings","7", "Abcd", "3.1416");
        Collections.sort( list );
        System.out.println( list );
    

打印

$ java Sort
[3.1416, 7, Abcd, Kings]

这是你需要的吗?

编辑

假设(猜测)您需要对一副既有数字又有“字母”(J、Q、K、A)的卡片进行排序,您可以尝试使用自定义比较器。

这是一个将数字“作为数字”考虑在内,其余作为字符串考虑,因此“10”出现在“2”之后但在“Kings”之前

import java.util.*;
class Sort 
    public static void main( String [] args  ) 

        List<String> list = Arrays.asList("Kings","7", "Queen", "3", "10", "A", "2", "8", "Joker");
        Collections.sort( list , new Comparator<String>()
            public int compare( String a, String b )
                // if both are numbers
                if( a.matches("\\d+") && b.matches("\\d+")) 
                    return new Integer( a ) - new Integer( b );
                
                // else, compare normally. 
                return a.compareTo( b );
            
        );
        System.out.println( list );
    


$ java Sort
[2, 3, 7, 8, 10, A, Joker, Kings, Queen]

如果这是您需要的,我想这将帮助您弄清楚其余部分。接下来的事情可能是如何对黑桃和红桃进行排序。

按照Roman 的回答,您可以创建一个类并实现Comparable 接口:

  class Card implements Comparable<Card> 
       public int compareTo( Card other )   
           // add custom logic to compare one card with other 
       
   

【讨论】:

这不是他要的。我认为他希望您为所有卡名编写自定义比较器。 @Nikita:我知道他“认为”数字不包括在排序中。可能OP需要澄清一下。【参考方案3】:

Sort 将根据您的字符集对所有内容进行排序。换句话说,所有数字都将在字典顺序中位于字母之前。例如,十进制数字以“.”开头。并且按字典顺序乱序。

如果你想改变它,请创建 Comparator 对象。然后,您可以按照自己喜欢的顺序放置物品。

例如,这将按数字顺序对数字进行排序,并按词汇顺序对单词进行排序:

class CardComparator extends Object implements Comparator
 public int compare(Object a, Object b)
  try
   double d1=Double.valueOf(a.toString());
   try
     double d2=Double.valueOf(b.toString());
     return (d2>d1)?1:-1;            // both numeric
   catch(NumberFormatException e) // a is numeric but b isn't
     return 1;
   
  catch(NumberFormatException e)  
    try
     double d2=Double.valueOf(b.toString()); 
     return -1;                       // a is nonnumeric but b is
    catch(NumberFormatException e)  // both nonnumeric
      return a.toString().compareTo(b.toString);
    
  
 

Comparator comparator=new CardComparator();
Collections.sort(cards, comparator);

PS 未测试!

【讨论】:

【参考方案4】:

正如@Jon Skeet 所说,内置排序将根据 Unicode 值进行比较。您必须编写自己的排序方法。

不过,只要您编写自己的代码,我是否可以建议进行枚举?一副纸牌是使用枚举的典型示例之一。简短的版本是您可以为一组事物声明自己的排序顺序;如果您愿意,您甚至可以让黑桃 K 的排名超过方块 K。查看 Sun 的教程here。

【讨论】:

【参考方案5】:

据我了解,您有一个类似 ["7", "Queen", "9", "6"] 的数组,并且您希望它在排序完成后看起来像 ["Queen", "9", "7", "6"](或以相反的顺序)。

我建议让它更加面向对象,即创建带有字段名称和值的类 Card:

class Card 
   private final String name;
   private final int value;
   ...
   //constructor and getters

然后以这种方式创建实例:

Card six = new Card("6", 6);
Card ten = new Card("10", 10);
Card queen = new Card("Queen", 12);

之后,使用字段 value 而不是卡片名称,对卡片进行所有操作(尤其是排序)会容易得多。

【讨论】:

&lt;nitpick&gt; 按照惯例,卡片通常也有“花色”。 &lt;/nitpick&gt;

以上是关于如何对输入的指定个数的字符串进行按字典序排序?的主要内容,如果未能解决你的问题,请参考以下文章

内容:输入n个字符串,对这n个字符串进行排序(按升序),输出排序后的字符串。然后从键盘再次输入一字符

js对一个字符串根据ASCII码从小到大排序(字典序)

python怎么对字典进行排序

华为OD机试 2023最新 字符串重新排列字符串重新排序(C++ 100%)

如何按字典顺序对 ArrayList 进行排序?

DS内排—2-路归并排序