2024-01-01から1年間の記事一覧

2つのリストに存在する要素を抽出したリストを求める(Javaのケース)

先日、Python での 2つのリストに存在する要素を抽出したリストを求める - Oboe吹きプログラマの黙示録 を書いたので、 Java の方を整理して書き留めておく。 Java では、List と Set を意識して使いたいので、求める結果は Streamになるメソッドを 用意す…

2つのリストに存在する要素を抽出したリストを求める

l1 = [1, 2, 4, 5, 7, 9] l2 = [2, 3, 4, 6, 8] list ⇒ set(集合)に変換して積を求めて list に戻す s1 = set(l1) s2 = set(l2) s3 = s1 & s2 l3 = list(s3) l3 は、 [2, 4] 集合演算子 & で計算する代わりの積のメソッド(intersection)、 s3 = s1.intersect…

range(範囲)を生成する課題

範囲の幅から計算した範囲の数ではなく最大値で制限した範囲の処理をする課題が目的、 範囲の数を指定できる場合と比べていく。Java の場合、範囲幅=100 で、5個の範囲の処理、この 5個と指定できる場合は次のように簡単に書ける。 すなわち、IntStream.rang…

ウィンドウ関数を使ってグルーピングの先頭を抽出する

SQL

OVER() の PARTITION BY でグルーピングした中で、ORDER BY した先頭を抽出する。DBは、Oracle 、PostgreSQL、MySQL も同じ例)テーブル JOB_RESULTS を JOB_CD 列でグルーピングして POINT列 の ORDER BY DESC の結果、先頭を抽出する。ROW_NUMBER() を OVE…

Oracle WITH 文で乱数発生

SQL

1~1000 の間の乱数を100個作る。 対象:Oracle WITH generate(id, rnum) AS ( SELECT 1, TRUNC(dbms_random.value(1,1000 )) FROM dual UNION ALL SELECT id + 1, TRUNC(dbms_random.value(1,1000 )) FROM generate WHERE id + 1 <= 100 ) SELECT rnum FR…

WITH の複数を書く方法

SQL

WITH 句を複数記述する場合は、カンマで区切って WITH 宣言を書かずに次のWITH句を 記述する。PostgreSQL の例。1から8までの数値IDのテーブルに、乱数発生のテーブルのIDが奇数で外部結合させる。 WITH RECURSIVE generate1(id) AS ( SELECT 1 UNION ALL …

Predicate を効かした Iterable の生成のもう1つの方法

oboe2uran.hatenablog.comもっと単純に以下の方法、、 StreamSupport で作る filter に任せる。 static <T> Iterable<T> select(Iterable<T> it, Predicate<T> pred) { return () -> StreamSupport.stream(it.spliterator(), false) .filter(pred).iterator(); }</t></t></t></t>

Predicate を効かした Iterable の生成

Iterable<T> に、Predicate<T> を指定する形で生成する。 public static <T> Iterable<T> selectIterable(Iterable<T> it, Predicate<T> pred) { return () -> new Iterator<T>(){ Iterator<T> sourceIterator = it.iterator(); T current; boolean hasCurrent = false; @Override pu</t></t></t></t></t></t></t></t>…

Iterator から、Iterable への変換

短絡的だけど。。。 public static <T> Iterable<T> toIterable(Iterator<T> itr){ return new Iterable<T>(){ @Override public Iterator<T> iterator() { return itr; } }; }</t></t></t></t></t>

リストの最後、最大値

リストの最後、の見慣れない求め方 *_, last = [1, 3, 2, 6, 25, 2] print(last) functools の reduce でリストから最大値を求める res = functools.reduce(lambda a, b: a if a > b else b, [1, 3, 2, 6, 25, 2])

Predicate を適用した Iterator の作成

java.util.function.Predicate を適用した java.util.Iterator の生成List に対して生成します。 static メソッドです。 public static <T> Iterator<T> filterate(List<T> list, Predicate<T> predicate){ return new Iterator<T>(){ int ix = -1; @Override public boolea</t></t></t></t></t>…

フィルタの方法、内包表記、filter、itertools.filterfalse

対象リスト l1 = [3, 1, 9, 13, 10, 8, 17, 2] 10 より大きいリストを求める。内包表記を使う l2 = [e for e in l1 if e > 10] filter を使う l2 = list(filter(lambda x:x > 10, l1)) itertools.filterfalse を使う import itertools l1 = [3, 1, 9, 13, 10…

itertools で、順列、組み合わせ

順列:Permutation import itertools po = itertools.permutations(['A', 'B', 'C'], 2) print(type(po)) plist = list(po) print(plist) for v in itertools.permutations(['A', 'B', 'C'], 2): print(v) <class 'itertools.permutations'> [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C')</class>…

Java でデカルト積(直積)

Python でデカルト積(直積) - Oboe吹きプログラマの黙示録 に触発されて、Java 環境でのデカルト積を求めるものを作りました。 import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; /** * デカルト…

Python でデカルト積(直積)

簡単なデカルト積を作るサンプル itertools をインポート import itertools product( 要素リスト, ,,, ) で生成する。 作成されるのは、イテラブル・オブジェクト list1 = ['A', 'B'] list2 = [1, 2, 3] products = itertools.product(list1, list2) print(p…

Oracle には、PostgreSQL の GENERATE_SERIES に相当する関数がない

SQL

表題の件、では代わりにストアド FUNCTION でも代替案があるのだろうが、 ストアド FUNCTION 定義の権限がない時、 WITH句で対応する方法がある。数値の例 WITH generate_series(n) AS ( SELECT 1 FROM dual UNION ALL SELECT n + 1 FROM generate_series WH…

Pandas CSV行番号、列番号でデータを取得する

DataFrame [] スライスで取得したい行を取得 取得した DataFrame の values で numpy.ndarray を取得して、 (values取得で多次元配列 ndarray は、2次元配列だから[0]で1行分を取得) tolist() でリストに変換例)注意:CSV先頭行はヘッダ行で、データ行…

Pandas を使って重複のあるCSVから重複行を取り除いたCSVを生成する

任意の列項目で重複があるCSV 先日のサンプル ⇒ Pandas を使ってcsv 任意の列で重複するキーの組み合わせを求める。 - Oboe吹きプログラマの黙示録 にあるようなCSVから、 重複行を取り除いたCSVを生成する。DataFrame に対して drop_duplicates(subset=[ 重…

pandas を使った重複有無の判定

先日書いたのは、CSVでどのような重複があるかを調査するものだった。 Pandas を使ってcsv 任意の列で重複するキーの組み合わせを求める。 - Oboe吹きプログラマの黙示録重複有無のだけを判定する方法をまとめた。先日の Pandas を使ってcsv 任意の列で重複…

Pandas を使ってcsv 任意の列で重複するキーの組み合わせを求める。

サンプルのCSV 品名 産地 単価 数量 キャベツ 群馬県 219 120 コシヒカリ 新潟県 3350 20 小松菜 茨城県 198 40 キャベツ 群馬県 209 80 りんご 長野県 224 100 小松菜 茨城県 188 90 キャベツ 神奈川県 210 70 キャベツ 群馬県 224 100 '品名'と'産地'が重…

DBeaver CSVエクスポート時にBOMを付与

DBeaver というツールを使って、テーブルやSQLクエリ結果を CSVにエクスポート出力する時に、UTF-8 文字コードで出力する時、 BOMを付与するには、以下のようにエクスポート実行画面で BOMを挿入にチェックをつける

groupingBy や toMap で作成したリスト

今更のことであるが。。。 List.of で作る List は、AbstractImmutableList だけど、 Java Stream の groupingBy や toMap で作成したキーに対するリストは、AbstractImmutableList ではない。 だから、 List<Item> list このすでに存在するAbstractImmutableList </item>…

ROW_NUMBER() でページング

SQL

実行計画を調査して、ヒント句を付けるなどの調整も検討が必要であるが、 ROW_NUMBER() でページングでをする場合のSQLは、以下のようになる。1ページ目として先頭1行目~10行目 SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY avrg DESC, point DE…

__iter__() の実装例、日付繰り返し

__iter__() イテレータの実装例日付の開始と終了から1日ずつの datetime.date を返すイテレータ class Datedayrange: import datetime def __init__(self, start_date: datetime.date, end_date: datetime.date): if start_date > end_date: raise ValueErr…

Windows PowerShell で tail

UTF-8で出力された巨大なログなどを tail PowerShell で実行する。Get-Content -Encoding UTF8 -Tail 行数 -Path ログファイルパスtail -f のように、読込みを継続したいのであれば、更に -Wait オプションを付加する

SQLバインド変数の上限

Oracle は、SQLバインド変数の上限を超えると、 ORA-01745: ホスト/バインド変数名が無効です。 が発生する Oracle のバインド変数の上限は、32768PostgreSQL は、32767MySQL はクエリの上限サイズで制限を見た方が良いみたい show variables like 'max_allo…

Unicodeエスケープされた文字列

\uXXXX という書式、Unicodeエスケープされた文字とASCII文字だけの文字列 を例にする。 \u3042\u3044\u3046\u3048\u304a_%abc123_\uff76\uff77\uff78\uff79\uff7a Python では、\uXXXX 書式文字列は、\をエスケープして文字列として持つことになる。 ustr =…

List の要素の最大値、最小値もリストインデックスを求める

Java の List 要素の置き換え(List の set メソッド実行)でも要件がない限り、 List のインデックスを求める要件などないであろう。Integer List の最大値のインデックスIntStream の reduce で求める Optional<Integer> res = IntStream.range(0, list.size()).box</integer>…

先頭に指定の文字列パターンを持たない判定の正規表現

否定先読みを使ってマッチさせない先頭文字列を指定する 書式 (?!パターン) 例)先頭文字列が A4 にマッチしない^(?!A4).*$ 例)先頭文字列が A4 または A5 にマッチしない^(?!A[45]).*$この否定先読みをSQLの REGEXP_LIKE で使用する時、 PostgreSQL と、My…

UTC時刻の取得と日本時間

datetime.timezone.utc でUTCタイムゾーン時刻を取得します datetime.timedelta で日本のタイムゾーン時刻に変換 from datetime import datetime, timezone, timedelta # UTCタイムゾーンの現在時刻を取得 dt = datetime.now(timezone.utc) # 日本標準時(JS…