問題タブ [natural-sort]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
14 に答える
37144 参照

sql-server - Microsoft SQL 2005 での自然な (人間の英数字による) 並べ替え

DB側のページネーションを持つ大規模なデータベースがあります。これは迅速で、数百万のレコードからわずか 1 秒で 50 行のページを返します。

ユーザーは、基本的にソートする列を選択して、独自のソートを定義できます。列は動的です - 数値、日付、テキストを持つものがあります。

ほとんどの場合、テキストは期待どおりにソートされますが、愚かな方法でソートされます。それはコンピューターにとっては理にかなっていますが、ユーザーを苛立たせます。

たとえば、文字列レコード ID で並べ替えると、次のようになります。

...等々。

これに番号を考慮してもらいたいので、次のようにします。

入力を制御できず (そうでなければ先頭の 000 でフォーマットするだけです)、単一のフォーマットに頼ることもできません - いくつかは "{alpha code}-{dept code}-{rec id}" のようなものです。

C# でこれを行ういくつかの方法を知っていますが、すべてのレコードをプルダウンしてソートすることはできません。

Sqlサーバーで自然な並べ替えをすばやく適用する方法を知っている人はいますか?


私たちは使用しています:

そして、それによってページングしています。

トリガーを追加することはできますが、追加することはできません。彼らの入力はすべてパラメータ化されていますが、形式を変更することはできません.「rec2」と「rec10」を入力すると、そのように自然な順序で返されることを期待しています.


クライアントごとに異なる形式に従う有効なユーザー入力があります。

rec1、rec2、rec3、... rec100、rec101

別の可能性があります: grp1rec1、grp1rec2、... grp20rec300、grp20rec301

入力を制御できないというのは、ユーザーにこれらの標準を変更するよう強制できないという意味です。これらの標準には grp1rec1 のような値があり、それを grp01rec001 として再フォーマットすることはできません。外部システムへのリンク。

これらの形式はさまざまですが、多くの場合、文字と数字が混在しています。

これらを C# で並べ替えるのは簡単です。それを分割して{ "grp", 20, "rec", 301 }、シーケンス値を順番に比較するだけです。

ただし、何百万ものレコードがあり、データがページングされている可能性があるため、SQL サーバーで並べ替えを行う必要があります。

SQLサーバーは比較ではなく値でソートします-C#では値を分割して比較できますが、SQLでは一貫してソートする単一の値を(非常に迅速に)取得するロジックが必要です。

@moebius - あなたの答えはうまくいくかもしれませんが、これらすべてのテキスト値にソートキーを追加するのは醜い妥協のように感じます.

0 投票する
14 に答える
10015 参照

algorithm - 自然な並べ替えアルゴリズム

さまざまなプログラミング言語で文字列の配列を自然に並べ替えるにはどうすればよいですか? 実装とそれがどの言語であるかを回答に投稿してください。

0 投票する
22 に答える
86859 参照

sql - MySQL の自然な並べ替え

MySQL データベースで効率的で自然な並べ替えを行うエレガントな方法はありますか?

たとえば、このデータセットがある場合:

  • ファイナルファンタジー
  • ファイナルファンタジー4
  • ファイナルファンタジー10
  • ファイナルファンタジー12
  • ファイナルファンタジー12 プロマシアの鎖
  • ファイナルファンタジーアドベンチャー
  • ファイナルファンタジーオリジンズ
  • ファイナルファンタジータクティクス

ゲームの名前をコンポーネントに分割する以外のエレガントなソリューション

  • タイトル:「ファイナルファンタジー」
  • 番号:「12」
  • 副題:「プロマシアの鎖」

それらが正しい順序で出てくることを確認するには?(2 の前ではなく、4 の後の 10)。

これを行うのは苦痛です**。ゲーム タイトルを解析するメカニズムを破る別のゲームが時々あるからです (例: "Warhammer 40,000"、"James Bond 007")。

0 投票する
18 に答える
61055 参照

c# - C#での自然順

誰かが良いリソースを持っているか、FileInfo配列のC#で自然順序ソートのサンプルを提供しますか?私はIComparer自分の種類のインターフェースを実装しています。

0 投票する
4 に答える
41630 参照

perl - ハッシュのキーを自然に並べ替えるにはどうすればよいですか?

キーが数字で始まる、または数字であるPerlハッシュがあります。

使用する場合、

リストは次のように表示される可能性があります、

それ以外の

0 投票する
1 に答える
1531 参照

c# - IComparer の問題 + .NET で文字列の配列 (FILE_10 > FILE_2) を自然に並べ替えるにはどうすればよいですか?

私の投稿の一番下で解決しました。

またはより具体的には:

たくさんの FileInfo オブジェクトがあります (隠しファイル、システム ファイル、再解析ポイント ファイルを除外するには、FileInfo オブジェクトが必要です)。

FileInfo.FullName に基づいて FileInfo[] を自然に並べ替える必要があります。したがって、FILE_10.ext は FILE_2.ext の後に来る必要があります。幸いなことに、FileInfo[] には拡張子が 1 つのみのファイルが含まれています。

私は比較子を実装しました:

ここで、int.Parse が適切なポイントでキャッチできなかった OverflowException をスローするという問題が発生します (何らかの理由で return ステートメントの行で再発し、1 レベル上でインテリジェントに処理できません。そこの)。

問題は次のとおりです。この種の事前実装された比較子はありますか? そして、面白い場所で例外が発生する理由は何でしょうか?

呼び出しコード:

EDIT1: Int.Parse は、大きすぎる数値に遭遇すると OverflowException をスローします。定期的に発生するべきではありませんが、カバーしてほしいです。

EDIT2:私は自分のComparerを調整することになりました。int.Parse から離れて、比較のために左側にゼロが埋め込まれました。ここにコード:

0 投票する
5 に答える
3879 参照

sql - ユーザーが期待するように、アルファベットと数字の混合リストを並べ替えて表示するにはどうすればよいですか?

私たちのアプリケーションにはCustomerNumberフィールドがあります。何百人もの人々がシステムを使用しています (それぞれが独自のログインと独自の のリストを持っていますCustomerNumber)。個々のユーザーは、最大で 100,000 人の顧客を持つことができます。多くは100未満です。

顧客番号フィールドに実際の数字のみを入力する人もいれば、それらを組み合わせて使用​​する人もいます。システムでは、A ~ Z、0 ~ 9、またはダッシュの 20 文字を使用でき、これらを VARCHAR2(20) に格納します。小文字は格納される前に大文字に変換されます。

ここで、特定のユーザーのすべての顧客を顧客番号で並べ替えて一覧表示する簡単なレポートがあるとします。例えば

これは単純な解決策です。数値しか使用しない人は、単純なアルファベット順 (「9」の前に「10」が来る) を見たくないからです。

ユーザーのデータについて不必要な質問をしたくありません。

私は Oracle を使用していますが、他のデータベースのソリューションも見られると興味深いと思います。回答がどのデータベースで機能するかを含めてください。

これを実装する最良の方法は何だと思いますか?

0 投票する
9 に答える
13700 参照

c++ - C ++で自然ソートアルゴリズムを実装する方法は?

テキストと数字で構成される文字列を並べ替えています。並べ替えで、数字の部分を英数字ではなく数字として並べ替えたい。

たとえば、次のようにします:abc1def、...、abc9def、abc10def

代わりに:abc10def、abc1def、...、abc9def

誰かがこれのためのアルゴリズムを知っていますか(特にc ++で)

ありがとう

0 投票する
2 に答える
221 参照

mysql - 自然順を使用して最大データを取得する方法は?

これはvarchar列です。しかし、「10.12.19」は私が必要とする最大のデータです。どうすれば入手できますか?