souki-paranoiastのブログ

地方都市でプログラマーをやっている人のブログ。技術ネタ以外も少し書く。メインの言語はJava。https://paranoiastudio-japan.jimdo.com/ に所属

雑記

ChatGPT 4 有用ですね

もう話題になって結構時間が経つ気もするけど、今月頭くらいからたまに触っている。 で、過去に記載しているような小ネタというかふと気になった系のネタを書いてもらうと、自分で書いたものより精度が高い(ネットにもたくさん転がっているだろうからそれ自体にはあまり驚かないけども)。

流石にこれで大きいアプリケーションを組み立てていくとなると話は変わるけど、なかなかに面白いしびっくりする。

色々やりとりはあったけど、こんなコードを書いたら

public static <T, R> Stream<R> zippedIndex(Iterable<T> ite, BiFunction<T, Integer, R> f) {
  AtomicInteger i = new AtomicInteger();
  return StreamSupport.stream(ite.spliterator(), false)
    .map(e -> f.apply(e, i.getAndIncrement()));
}

最終的にはこうすると良いよ!って返ってきた。

public static <T, R> Stream<R> zippedIndex(Iterable<T> iterable, BiFunction<T, Integer, R> function) {
    Iterator<T> iterator = iterable.iterator();
    
    // Custom iterator that keeps track of the index
    Iterator<R> indexedIterator = new Iterator<R>() {
        private int index = 0;

        @Override
        public boolean hasNext() {
            return iterator.hasNext();
        }

        @Override
        public R next() {
            T value = iterator.next();
            R result = function.apply(value, index);
            index++;
            return result;
        }
    };

    // Convert the iterator back to a stream
    return StreamSupport.stream(
        Spliterators.spliteratorUnknownSize(indexedIterator, Spliterator.ORDERED),
        false
    );
}

無駄にmap()挟んだりAtomicIntegerで管理するくらいならまとめろって話らしい。 全く以ってその通りだと思う。

去年(! 時間経つの早いよ…)書いたJavaでSocketライブラリを用いて云々みたいなのも1分もかからずに書いてくれました。 なんならHttps接続するサンプルとかも色々書いてくれました。

本当にGoogle検索をする量が減った。 SEO対策を頑張っているのに欲しい情報のないページとかを見る時間が無くなるのよね。自然言語でも解析してくれるし。 細かいところとか平気で嘘つくところもあるけど、付き合い方を考えれば月3000円は破格の値段だよなぁと。 次ブログを書く頃にはまた情勢が変わっているのかもしれない。楽しみ。

雑に速度測った

10万回無駄な処理を実行して計算時間を測る。 zippedIndex1()が自分で書いた方。2が推奨のもの。 だいたい、1の方が35~40msで2の方が25~30msくらいだった。 1の方をintArrayで試したけどそれでも30~35msって感じ。

    public static void main(String[] args) {
        for (int i = 0; i < 1000; i++) {
            System.out.print(i);
        }
        System.out.println();
        System.out.println();

        List<String> list = IntStream.range(1, 100000)
                .mapToObj(String::valueOf)
                .toList();


        long before1 = System.nanoTime();
        List<String> list1 = zippedIndex1(list, (s, i) -> s + "__" + i)
                .toList();
        long after1 = System.nanoTime();


        long before2 = System.nanoTime();
        List<String> list2 = zippedIndex2(list, (s, i) -> s + "__" + i)
                .toList();
        long after2 = System.nanoTime();


        System.out.println(list1);
        System.out.println(list2);
        System.out.println(TimeUnit.NANOSECONDS.toMillis(after1 - before1));
        System.out.println(TimeUnit.NANOSECONDS.toMillis(after2 - before2));
    }