LoginSignup
1
0

More than 3 years have passed since last update.

java 回転コマンドの作成

Last updated at Posted at 2019-11-16

まえがき

javaコマンドで回転コマンド作成した。

参考文献

環境

$java --version
openjdk 13 2019-09-17
OpenJDK Runtime Environment (build 13+33)
OpenJDK 64-Bit Server VM (build 13+33, mixed mode, sharing)
$bash --version
GNU bash, バージョン 5.0.0(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$jshell --version
jshell 13

スクリプト

1.Left_Stair.java

先頭要素取得して末尾要素に追加していくパターン。

import sun.misc.Signal;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Left_Stair {
    public static void main(String[] rsv_args) {
        trap(new String[]{"INT"});
        try{
            if(rsv_args.length==0){
                //via pipe args
                Scanner stdin=new Scanner(System.in);
                List<String> liz = new ArrayList<>(Arrays.asList(stdin.nextLine().split(" ")));
                circle(liz);
                stdin.close();
            }else{
                //via cmdline args
                List<String> liz = new ArrayList<>(Arrays.asList(rsv_args));
                circle(liz);
            }
        }catch(Exception e){
            usage();
            e.printStackTrace();
            System.exit(1);
        }
    }
    private static void circle(List<String> rsv_liz){
        for (int ind=0;ind<rsv_liz.size();ind++){
            String ele=rsv_liz.get(0);
            rsv_liz.remove(rsv_liz.indexOf(ele));
            rsv_liz.add(rsv_liz.size(),ele);
            System.out.println(rsv_liz);
        }
    }
    private static void trap(String[] sig_args){
        for (String sig:sig_args) {
            catch_sig(sig);
        }
    }
    private static void usage() {
        final String className = new Object(){}.getClass().getEnclosingClass().getName();
        System.out.println("\nUsage:\n" +
                "$echo {a..c} | java "+ className +"\n"+
                "$java "+ className +" {a..c}"+"\n"+
                "$java "+className +"$(echo -e '\\U1f4a'{0..9})\n"+
                "$echo -e '\\U1f4a'{0..9} | java "+className+"\n"
        );
        System.exit(1);
    }
    private static void catch_sig(String sig) {
        Signal signal = new Signal(sig);
        Signal.handle(signal, Signal -> {
            if ("INT".equals(signal.getName())) {
                usage();
            }
        });
    }
}

先頭要素が次の対象行の末尾要素に追加されていく様子がわかる。

$echo -e '\U1f4a'{0..9} | java Left_Stair.java
[💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠]
[💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡]
[💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢]
[💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣]
[💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤]
[💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥]
[💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦]
[💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧]
[💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨]
[💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩]

コンパイル事前にしなくても行けるぽい。コンパイルしたときと比べてちょっと時間かかっている。

$time echo -e '\U1f4a'{0..9} | java Left_Stair.java
[💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠]
[💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡]
[💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢]
[💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣]
[💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤]
[💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥]
[💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦]
[💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧]
[💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨]
[💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩]

real    0m0.414s
user    0m1.058s
sys 0m0.098s

コンパイル。警告でる。

$javac Left_Stair.java
Left_Stair.java:1: 警告:Signalは内部所有のAPIであり、今後のリリースで削除される可能性があります
import sun.misc.Signal;
               ^
Left_Stair.java:57: 警告:Signalは内部所有のAPIであり、今後のリリースで削除される可能性があります
        Signal signal = new Signal(sig);
        ^
Left_Stair.java:57: 警告:Signalは内部所有のAPIであり、今後のリリースで削除される可能性があります
        Signal signal = new Signal(sig);
                            ^
Left_Stair.java:58: 警告:Signalは内部所有のAPIであり、今後のリリースで削除される可能性があります
        Signal.handle(signal, Signal -> {
        ^
警告:Signalは内部所有のAPIであり、今後のリリースで削除される可能性があります
警告5個

コンパイルしておいたほうがちょっと早くなった。

$time echo -e '\U1f4a'{0..9} | java Left_Stair
[💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠]
[💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡]
[💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢]
[💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣]
[💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤]
[💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥]
[💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦]
[💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧]
[💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨]
[💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩]

real    0m0.069s
user    0m0.061s
sys 0m0.025s

javacコマンドに警告サプレスするオプションあるけど、ミュートできなかった。標準エラー出力を捨てたら、ミュートできた。

$javac -nowarn Left_Stair.java
Left_Stair.java:1: 警告:Signalは内部所有のAPIであり、今後のリリースで削除される可能性があります
import sun.misc.Signal;
               ^
Left_Stair.java:57: 警告:Signalは内部所有のAPIであり、今後のリリースで削除される可能性があります
        Signal signal = new Signal(sig);
        ^
Left_Stair.java:57: 警告:Signalは内部所有のAPIであり、今後のリリースで削除される可能性があります
        Signal signal = new Signal(sig);
                            ^
Left_Stair.java:58: 警告:Signalは内部所有のAPIであり、今後のリリースで削除される可能性があります
        Signal.handle(signal, Signal -> {
        ^
警告:Signalは内部所有のAPIであり、今後のリリースで削除される可能性があります
警告5個
$javac -nowarn Left_Stair.java 2>/dev/null

2.Right_Stair.java

末尾要素取得して先頭要素に追加していくパターン。

import sun.misc.Signal;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Right_Stair {
    public static void main(String[] rsv_args) {
        trap(new String[]{"INT"});
        try{
            if(rsv_args.length==0){
                //via pipe args
                Scanner stdin=new Scanner(System.in);
                List<String> liz = new ArrayList<>(Arrays.asList(stdin.nextLine().split(" ")));
                circle(liz);
                stdin.close();
            }else{
                //via cmdline args
                List<String> liz = new ArrayList<>(Arrays.asList(rsv_args));
                circle(liz);
            }
        }catch(Exception e){
            usage();
            e.printStackTrace();
            System.exit(1);
        }
    }
    private static void circle(List<String> rsv_liz){
        for (int ind=0;ind<rsv_liz.size();ind++){
            String ele=rsv_liz.get(rsv_liz.size()-1);
            rsv_liz.remove(rsv_liz.indexOf(ele));
            rsv_liz.add(0,ele);
            System.out.println(rsv_liz);
        }
    }
    private static void trap(String[] sig_args){
        for (String sig:sig_args) {
            catch_sig(sig);
        }
    }
    private static void usage() {
        final String className = new Object(){}.getClass().getEnclosingClass().getName();
        System.out.println("\nUsage:\n" +
                "$echo {a..c} | java "+ className +"\n"+
                "$java "+ className +" {a..c}"+"\n"+
                "$java "+className +"$(echo -e '\\U1f4a'{0..9})\n"+
                "$echo -e '\\U1f4a'{0..9} | java "+className+"\n"
        );
        System.exit(1);
    }
    private static void catch_sig(String sig) {
        Signal signal = new Signal(sig);
        Signal.handle(signal, Signal -> {
            if ("INT".equals(signal.getName())) {
                usage();
            }
        });
    }
}

末尾要素が先頭要素に追加されていく様子がわかる。

$time echo -e '\U1f4a'{0..9} | java Right_Stair
[💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨]
[💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧]
[💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦]
[💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥]
[💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤]
[💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣]
[💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢]
[💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡]
[💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠]
[💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩]

real    0m0.059s
user    0m0.063s
sys 0m0.026s

3.square.sh

上記スクリプトをそれぞれ左と右、右と左に並びて、与える引数を正順と逆順の2つにしたパターン。

#!/bin/bash

usage(){
  cat <<EOF
Usage:
\$$0 \$(echo -e '\U1f4a'{0..9})
\$$0 '\U1f4a'{0..9}
\$echo -e '\U1f4a'{0..9} | $0
\$seq 10 | xargs -n4 | $0
EOF
  exit 1
}

chk_single_row(){
  #単一行チェック
  local CNT=0
  while read ln;do
    [ $(echo $ln | grep -c "0a") -eq 1 ] && CNT=$((CNT + 1))
  done < <(echo "$@" | xxd -ps -c1)
  [ $CNT -gt 1 ] || echo 0
  [ $CNT -gt 1 ] && echo 1
}

chk_argc(){
  #引数個数チェック
  declare -a argv=()
  local argv=($@)
  local argc="${#argv[@]}"
  [ "${argc}" -le 1 ] && usage && exit 1
}

single_circle(){
  local rsv_args="$@";
  #単一行の場合
  while read ln;do
    paste -d' ' <(echo "${ln}" | java Left_Stair.java) <(echo "${ln}" | rev | java Right_Stair.java)
    paste -d' ' <(echo "${ln}" | java Right_Stair.java) <(echo "${ln}" | rev | java Left_Stair.java)
  done <<<"${rsv_args}"
  exit 0
}

multip_circle(){
  local rsv_args="$@";
  #複数行の場合
  while read ln;do
    paste -d' ' <(echo "${ln}" | java Left_Stair.java) <(echo "${ln}" | tac | java Right_Stair.java)
    paste -d' ' <(echo "${ln}" | java Right_Stair.java) <(echo "${ln}" | tac | java Left_Stair.java)
  done <<<"${rsv_args}"
  exit 0
}

main(){
  local init_args="$(cat -)";
  chk_argc "${init_args}"
  ret=$(chk_single_row "${init_args}")
  [ $ret -eq 0 ] && single_circle "${init_args}"
  [ $ret -eq 1 ] && multip_circle "${init_args}"
}

[ -p /dev/stdin ] && cat - | main
[ -p /dev/stdin ] || echo -ne "$@" | main

きれいだ。

$echo -e '\U1f4a'{0..9} | ./square.sh
[💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠] [💠, 💩, 💨, 💧, 💦, 💥, 💤, 💣, 💢, 💡]
[💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡] [💡, 💠, 💩, 💨, 💧, 💦, 💥, 💤, 💣, 💢]
[💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢] [💢, 💡, 💠, 💩, 💨, 💧, 💦, 💥, 💤, 💣]
[💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣] [💣, 💢, 💡, 💠, 💩, 💨, 💧, 💦, 💥, 💤]
[💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤] [💤, 💣, 💢, 💡, 💠, 💩, 💨, 💧, 💦, 💥]
[💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥] [💥, 💤, 💣, 💢, 💡, 💠, 💩, 💨, 💧, 💦]
[💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦] [💦, 💥, 💤, 💣, 💢, 💡, 💠, 💩, 💨, 💧]
[💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧] [💧, 💦, 💥, 💤, 💣, 💢, 💡, 💠, 💩, 💨]
[💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨] [💨, 💧, 💦, 💥, 💤, 💣, 💢, 💡, 💠, 💩]
[💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩] [💩, 💨, 💧, 💦, 💥, 💤, 💣, 💢, 💡, 💠]
[💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨] [💨, 💧, 💦, 💥, 💤, 💣, 💢, 💡, 💠, 💩]
[💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧] [💧, 💦, 💥, 💤, 💣, 💢, 💡, 💠, 💩, 💨]
[💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦] [💦, 💥, 💤, 💣, 💢, 💡, 💠, 💩, 💨, 💧]
[💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥] [💥, 💤, 💣, 💢, 💡, 💠, 💩, 💨, 💧, 💦]
[💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤] [💤, 💣, 💢, 💡, 💠, 💩, 💨, 💧, 💦, 💥]
[💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣] [💣, 💢, 💡, 💠, 💩, 💨, 💧, 💦, 💥, 💤]
[💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢] [💢, 💡, 💠, 💩, 💨, 💧, 💦, 💥, 💤, 💣]
[💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡] [💡, 💠, 💩, 💨, 💧, 💦, 💥, 💤, 💣, 💢]
[💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠] [💠, 💩, 💨, 💧, 💦, 💥, 💤, 💣, 💢, 💡]
[💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩] [💩, 💨, 💧, 💦, 💥, 💤, 💣, 💢, 💡, 💠]

あとがき

ひっさしぶりにjava書いた。いろいろ変わって来てるんだなー。面白い機能ないか探していこ。
以上、ありがとうございました。

これもできる。

$echo -e '\U1f4a'{0..9}>input
$cat input
💠 💡 💢 💣 💤 💥 💦 💧 💨 💩
$cat input | ./square.sh 
[💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠] [💠, 💩, 💨, 💧, 💦, 💥, 💤, 💣, 💢, 💡]
[💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡] [💡, 💠, 💩, 💨, 💧, 💦, 💥, 💤, 💣, 💢]
[💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢] [💢, 💡, 💠, 💩, 💨, 💧, 💦, 💥, 💤, 💣]
[💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣] [💣, 💢, 💡, 💠, 💩, 💨, 💧, 💦, 💥, 💤]
[💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤] [💤, 💣, 💢, 💡, 💠, 💩, 💨, 💧, 💦, 💥]
[💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥] [💥, 💤, 💣, 💢, 💡, 💠, 💩, 💨, 💧, 💦]
[💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦] [💦, 💥, 💤, 💣, 💢, 💡, 💠, 💩, 💨, 💧]
[💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧] [💧, 💦, 💥, 💤, 💣, 💢, 💡, 💠, 💩, 💨]
[💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨] [💨, 💧, 💦, 💥, 💤, 💣, 💢, 💡, 💠, 💩]
[💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩] [💩, 💨, 💧, 💦, 💥, 💤, 💣, 💢, 💡, 💠]
[💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨] [💨, 💧, 💦, 💥, 💤, 💣, 💢, 💡, 💠, 💩]
[💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧] [💧, 💦, 💥, 💤, 💣, 💢, 💡, 💠, 💩, 💨]
[💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦] [💦, 💥, 💤, 💣, 💢, 💡, 💠, 💩, 💨, 💧]
[💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥] [💥, 💤, 💣, 💢, 💡, 💠, 💩, 💨, 💧, 💦]
[💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤] [💤, 💣, 💢, 💡, 💠, 💩, 💨, 💧, 💦, 💥]
[💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣] [💣, 💢, 💡, 💠, 💩, 💨, 💧, 💦, 💥, 💤]
[💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢] [💢, 💡, 💠, 💩, 💨, 💧, 💦, 💥, 💤, 💣]
[💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡] [💡, 💠, 💩, 💨, 💧, 💦, 💥, 💤, 💣, 💢]
[💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠] [💠, 💩, 💨, 💧, 💦, 💥, 💤, 💣, 💢, 💡]
[💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩] [💩, 💨, 💧, 💦, 💥, 💤, 💣, 💢, 💡, 💠]

ちょっとたのしい。^^

$seq 3 | ./square.sh 
[1] [1]
[1] [1]
[2] [2]
[2] [2]
[3] [3]
[3] [3]
$seq 10 | xargs -n3 | ./square.sh 
[2, 3, 1] [3, 1, 2]
[3, 1, 2] [2, 3, 1]
[1, 2, 3] [1, 2, 3]
[3, 1, 2] [2, 3, 1]
[2, 3, 1] [3, 1, 2]
[1, 2, 3] [1, 2, 3]
[5, 6, 4] [6, 4, 5]
[6, 4, 5] [5, 6, 4]
[4, 5, 6] [4, 5, 6]
[6, 4, 5] [5, 6, 4]
[5, 6, 4] [6, 4, 5]
[4, 5, 6] [4, 5, 6]
[8, 9, 7] [9, 7, 8]
[9, 7, 8] [8, 9, 7]
[7, 8, 9] [7, 8, 9]
[9, 7, 8] [8, 9, 7]
[8, 9, 7] [9, 7, 8]
[7, 8, 9] [7, 8, 9]
[10] [10]
[10] [10]

20191116追記

コメント頂いた方からの追記

private static void circle(List<String> rsv_liz){
    for (int ind=0;ind<rsv_liz.size();ind++){
        Collections.rotate(rsv_liz, -1);
        System.out.println(rsv_liz);
    }
}
private static void circle(List<String> rsv_liz){
    for (int ind=0;ind<rsv_liz.size();ind++){
        Collections.rotate(rsv_liz, 1);
        System.out.println(rsv_liz);
    }
}

Rotate.java

import sun.misc.Signal;

import java.util.*;

public class Rotate {
    public static void main(String[] rsv_args) {
        trap(new String[]{"INT"});
        try{
            if(rsv_args.length==0){
                //via pipe args
                Scanner stdin=new Scanner(System.in);
                List<String> liz = new ArrayList<>(Arrays.asList(stdin.nextLine().split(" ")));
                circle(liz);
                stdin.close();
            }else{
                //via cmdline args
                List<String> liz = new ArrayList<>(Arrays.asList(rsv_args));
                circle(liz);
            }
        }catch(Exception e){
            e.printStackTrace();
            System.exit(0);
        }
    }
    private static void circle(List<String> rsv_liz){
        for (int ind=0;ind<rsv_liz.size();ind++){
            Collections.rotate(rsv_liz, 1);
            System.out.println(rsv_liz);
        }
    }
    private static void trap(String[] sig_args){
        for (String sig:sig_args) {
            catch_sig(sig);
        }
    }
    private static void usage() {
        final String className = new Object(){}.getClass().getEnclosingClass().getName();
        System.out.println("\nUsage:\n" +
                "$echo {a..c} | java "+ className +"\n"+
                "$java "+ className +" {a..c}"+"\n"+
                "$java "+className +"$(echo -e '\\U1f4a'{0..9})\n"+
                "$echo -e '\\U1f4a'{0..9} | java "+className+"\n"
        );
        System.exit(0);
    }
    private static void catch_sig(String sig) {
        Signal signal = new Signal(sig);
        Signal.handle(signal, Signal -> {
            if ("INT".equals(signal.getName())) {
                usage();
            }
        });
    }
}

実行結果

$javac Rotate.java 2>/dev/null
$java Rotate {a..e}
[e, a, b, c, d]
[d, e, a, b, c]
[c, d, e, a, b]
[b, c, d, e, a]
[a, b, c, d, e]

Rev_Rotate.java

import sun.misc.Signal;

import java.util.*;

public class Rev_Rotate {
    public static void main(String[] rsv_args) {
        trap(new String[]{"INT"});
        try{
            if(rsv_args.length==0){
                //via pipe args
                Scanner stdin=new Scanner(System.in);
                List<String> liz = new ArrayList<>(Arrays.asList(stdin.nextLine().split(" ")));
                circle(liz);
                stdin.close();
            }else{
                //via cmdline args
                List<String> liz = new ArrayList<>(Arrays.asList(rsv_args));
                circle(liz);
            }
        }catch(Exception e){
            e.printStackTrace();
            System.exit(0);
        }
    }
    private static void circle(List<String> rsv_liz){
        for (int ind=0;ind<rsv_liz.size();ind++){
            Collections.rotate(rsv_liz, -1);
            System.out.println(rsv_liz);
        }
    }
    private static void trap(String[] sig_args){
        for (String sig:sig_args) {
            catch_sig(sig);
        }
    }
    private static void usage() {
        final String className = new Object(){}.getClass().getEnclosingClass().getName();
        System.out.println("\nUsage:\n" +
                "$echo {a..c} | java "+ className +"\n"+
                "$java "+ className +" {a..c}"+"\n"+
                "$java "+className +"$(echo -e '\\U1f4a'{0..9})\n"+
                "$echo -e '\\U1f4a'{0..9} | java "+className+"\n"
        );
        System.exit(0);
    }
    private static void catch_sig(String sig) {
        Signal signal = new Signal(sig);
        Signal.handle(signal, Signal -> {
            if ("INT".equals(signal.getName())) {
                usage();
            }
        });
    }
}

実行結果

$javac Rev_Rotate.java 2>/dev/null
$java Rev_Rotate {a..e}
[b, c, d, e, a]
[c, d, e, a, b]
[d, e, a, b, c]
[e, a, b, c, d]
[a, b, c, d, e]

コマンドラインからJshellにパラメタ渡して実行

もうこれでいいな。

echo -e '\U1f4a'{0..9} | xargs -I@ bash -c '
jshell -s <(cat <<EOS
import java.util.*;
List<String> liz = new ArrayList<>(Arrays.asList("@".split(" ")));
for(int ind=0;ind<liz.size();ind++){
  Collections.rotate(liz,1);
  System.out.println(liz);
}
/exit
EOS
)
'
$echo -e '\U1f4a'{0..9} | xargs -I@ bash -c '
jshell -s <(cat <<EOS
import java.util.*;
List<String> liz = new ArrayList<>(Arrays.asList("@".split(" ")));
for(int ind=0;ind<liz.size();ind++){
  Collections.rotate(liz,1);
  System.out.println(liz);
}
/exit
EOS
)
'
[💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨]
[💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧]
[💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦]
[💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥]
[💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤]
[💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣]
[💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢]
[💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡]
[💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠]
[💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩]

echo -e '\U1f4a'{0..9} | xargs -I@ bash -c '
jshell -s <(cat <<EOS
import java.util.*;
List<String> liz = new ArrayList<>(Arrays.asList("@".split(" ")));
for(int ind=0;ind<liz.size();ind++){
  Collections.rotate(liz,-1);
  System.out.println(liz);
}
/exit
EOS
)
'
$echo -e '\U1f4a'{0..9} | xargs -I@ bash -c '
jshell -s <(cat <<EOS
import java.util.*;
List<String> liz = new ArrayList<>(Arrays.asList("@".split(" ")));
for(int ind=0;ind<liz.size();ind++){
  Collections.rotate(liz,-1);
  System.out.println(liz);
}
/exit
EOS
)
'
[💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠]
[💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡]
[💣, 💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢]
[💤, 💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣]
[💥, 💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤]
[💦, 💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥]
[💧, 💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦]
[💨, 💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧]
[💩, 💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨]
[💠, 💡, 💢, 💣, 💤, 💥, 💦, 💧, 💨, 💩]

20191117追記

構造生み出せた。処理内容には特に意味はない。

#!/bin/bash

echo  {a..e} | xargs -I@ bash -c '
jshell -s <(cat <<EOS
private <T> List<T> cons(T first, List<T> remain) {
    List<T> ret = new ArrayList<>();
    ret.add(first);
    ret.addAll(remain);
    return ret;
}
private void process(List<String> rsv_args,int cnt){
  for(int ind=0;ind<cnt;ind++){
    String ele = rsv_args.remove(0);
    System.out.println(ele);
    System.out.println(rsv_args);
    List<String> liz_done = cons(ele,rsv_args);
    System.out.println(liz_done);
  }
}
private void main(List<String> rsv_args){
  process(rsv_args,rsv_args.size());
}
main(new ArrayList<>(Arrays.asList("@".split(" "))));
/exit
EOS
)
'
$echo  {a..e} | xargs -I@ bash -c '
jshell -s <(cat <<EOS
private <T> List<T> cons(T first, List<T> remain) {
    List<T> ret = new ArrayList<>();
    ret.add(first);
    ret.addAll(remain);
    return ret;
}
private void process(List<String> rsv_args,int cnt){
  for(int ind=0;ind<cnt;ind++){
    String ele = rsv_args.remove(0);
    System.out.println(ele);
    System.out.println(rsv_args);
    List<String> liz_done = cons(ele,rsv_args);
    System.out.println(liz_done);
  }
}
private void main(List<String> rsv_args){
  process(rsv_args,rsv_args.size());
}
main(new ArrayList<>(Arrays.asList("@".split(" "))));
/exit
EOS
)
'
a
[b, c, d, e]
[a, b, c, d, e]
b
[c, d, e]
[b, c, d, e]
c
[d, e]
[c, d, e]
d
[e]
[d, e]
e
[]
[e]
1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0