Как я могу сгенерировать метод toString () из полей?

У меня есть класс Java, который содержит такие поля:

private int port; private String portName; private ArrayList portList; private int id;

Мне нужна команда или скрипт, поэтому я могу напрямую вставить этот блок в терминал и передать его в качестве ввода этой команды или скрипта и дайте мне следующий вывод:

public String toString() { return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}"; }
2
задан 26 November 2017 в 14:26

9 ответов

Oneliner с использованием awk (т. е. GNU Awk):

awk 'BEGIN{printf"public String toString() {\n    return \"{ \""}{gsub(";$","");printf" + \"";if(NR>1){printf","};printf$3"=\" + "$3}END{print" + \"}\";\n}"}'

Используйте его следующим образом:

$ awk 'BEGIN{printf"public String toString() {\n    return \"{ \""}{gsub(";$","");printf" + \"";if(NR>1){printf","};printf$3"=\" + "$3}END{print" + \"}\";\n}"}' <<EOF
> private int port;
> private String portName;
> private ArrayList portList;
> private int id;
> EOF
public String toString() {
    return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}";
}

Версия скрипта с пояснительным комментарием

[ f3]

Сохраните его, например, generate_toString, сделайте его исполняемым с помощью chmod +x generate_toString и используйте его следующим образом:

$ ./generate_toString <<EOF
> private int port;
> private String portName;
> private ArrayList portList;
> private int id;
> EOF
public String toString() {
    return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}";
}

Пока это делает то, что вы просили, чтобы решить вашу актуальную проблему, есть гораздо лучшие подходы, см. @ DavidFoerster's as а также комментарий @ nickb выше. Нет необходимости изобретать велосипед.

3
ответ дан 22 May 2018 в 15:54
  • 1
    Спасибо, что ответили на мой вопрос. Ваше решение работает отлично. Мне особенно понравился oneliner. И да, это была моя ошибка, что я забыл «+» перед последней скобкой. Итак, вы сделали правильно. – Kashyap Kansara 26 November 2017 в 14:23

Oneliner с использованием awk (т. е. GNU Awk):

awk 'BEGIN{printf"public String toString() {\n return \"{ \""}{gsub(";$","");printf" + \"";if(NR>1){printf","};printf$3"=\" + "$3}END{print" + \"}\";\n}"}'

Используйте его следующим образом:

$ awk 'BEGIN{printf"public String toString() {\n return \"{ \""}{gsub(";$","");printf" + \"";if(NR>1){printf","};printf$3"=\" + "$3}END{print" + \"}\";\n}"}' <<EOF > private int port; > private String portName; > private ArrayList portList; > private int id; > EOF public String toString() { return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}"; }

Версия скрипта с пояснительным комментарием

#!/usr/bin/awk -f # do the following before processing the text BEGIN { # print this text, '\n' is a line break and '\"' a literal '"' printf "public String toString() {\n return \"{ \"" } { # remove semicolon at the end of the line gsub(";$",""); # print ' + "' printf " + \""; # if the line number is > 1 print ',' if (NR > 1) { printf "," }; # print the third row followed by '=" + ' and the third row again printf $3"=\" + "$3 } # do the following after processing the text END { # print ' + "}";\n}', '\n' is a line break print " + \"}\";\n}" }

Сохраните его, например, generate_toString, сделайте его исполняемым с помощью chmod +x generate_toString и используйте его следующим образом:

$ ./generate_toString <<EOF > private int port; > private String portName; > private ArrayList portList; > private int id; > EOF public String toString() { return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}"; }

Пока это делает то, что вы просили, чтобы решить вашу актуальную проблему, есть гораздо лучшие подходы, см. @ DavidFoerster's as а также комментарий @ nickb выше. Нет необходимости изобретать велосипед.

3
ответ дан 18 July 2018 в 02:35

Oneliner с использованием awk (т. е. GNU Awk):

awk 'BEGIN{printf"public String toString() {\n return \"{ \""}{gsub(";$","");printf" + \"";if(NR>1){printf","};printf$3"=\" + "$3}END{print" + \"}\";\n}"}'

Используйте его следующим образом:

$ awk 'BEGIN{printf"public String toString() {\n return \"{ \""}{gsub(";$","");printf" + \"";if(NR>1){printf","};printf$3"=\" + "$3}END{print" + \"}\";\n}"}' <<EOF > private int port; > private String portName; > private ArrayList portList; > private int id; > EOF public String toString() { return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}"; }

Версия скрипта с пояснительным комментарием

#!/usr/bin/awk -f # do the following before processing the text BEGIN { # print this text, '\n' is a line break and '\"' a literal '"' printf "public String toString() {\n return \"{ \"" } { # remove semicolon at the end of the line gsub(";$",""); # print ' + "' printf " + \""; # if the line number is > 1 print ',' if (NR > 1) { printf "," }; # print the third row followed by '=" + ' and the third row again printf $3"=\" + "$3 } # do the following after processing the text END { # print ' + "}";\n}', '\n' is a line break print " + \"}\";\n}" }

Сохраните его, например, generate_toString, сделайте его исполняемым с помощью chmod +x generate_toString и используйте его следующим образом:

$ ./generate_toString <<EOF > private int port; > private String portName; > private ArrayList portList; > private int id; > EOF public String toString() { return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}"; }

Пока это делает то, что вы просили, чтобы решить вашу актуальную проблему, есть гораздо лучшие подходы, см. @ DavidFoerster's as а также комментарий @ nickb выше. Нет необходимости изобретать велосипед.

3
ответ дан 24 July 2018 в 17:36

Я думаю, что это то, что вы хотите.

#!/bin/bash
# Create Java toString() method from stdin.

while read line; do
    word_last="${line##* }"
    name="${word_last%;}"
    if [[ $pairs ]]; then
        printf -v pair '",%s=" + %s + ' "$name" "$name"
    else
        printf -v pair '"%s=" + %s + ' "$name" "$name"
    fi
    pairs+="$pair"
done

printf '%s\n' 'public String toString() {'
printf '    return "{ " + %s"}";\n' "$pairs"
printf '%s\n' '}'

Вызов:

$ bash create_java_toString.sh << EOF
> private int port;
> private String portName;
> private ArrayList portList;
> private int id;
> EOF
public String toString() {
    return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}";
}

Другие примеры:

$ bash create_java_toString.sh << EOF
> private int i;
> private int j;
> EOF
public String toString() {
    return "{ " + "i=" + i + ",j=" + j + "}";
}
$ bash create_java_toString.sh << EOF
> EOF
public String toString() {
    return "{ " + "}";
}
3
ответ дан 22 May 2018 в 15:54
  • 1
    Спасибо, что нашли время ответить на мой вопрос. Ваше решение работает отлично, как ожидалось. И да, я попытался сделать это сам, но не мог идти дальше, чем разделять поля, поскольку я мало знаю о командах. – Kashyap Kansara 26 November 2017 в 13:46

Я не знаю, как вы собираетесь использовать этот скрипт, но это должно начать вас в правильном направлении:

#!/usr/bin/env bash

# get the argumetenst from the command line

# Sample terminal usage
# tostring -p port -n portName -l portLiat -i id


echo ""
echo ""

while getopts :p:n:l:i: option
do
        case "${option}" in
                p) port=${OPTARG};;
                n) portName=${OPTARG};;
                l) portList=${OPTARG};;
                i) id=${OPTARG};;
                \?) 
                        echo ""
                        echo -e "\e[0;31m Please supply the required values: $OPTARG \e[0m" 1>&2 
                        echo ""
                        echo " Usage: tostring -p port -n portName -l portList -i id"
                        echo ""
                        exit 1
                        ;;
                : )
                        echo "Invalid option $OPTARG requires an argument" 1>&2
                        ;;
        esac
done
shift $((OPTIND -1))

echo ""
echo ""

echo -e "\e[0;33m public String toString() {"
echo -e "       return "{ " + "port=" + "$port" + ",portName=" + "$portName" + ",portList=" + "$portList" + ",id=" + "$id" "}";"
echo ""
echo ""
echo -e "}"
echo -e "\e[0m"

Дополнительная информация:

https: // sookocheff .com / запись / Баш / разбор-баш-скрипт-аргументы-с-shopts /

1
ответ дан 22 May 2018 в 15:54
  • 1
    Я думаю, вы не поняли вопрос правильно. Имя полей не фиксировано. Они будут отличаться для разных классов. – Kashyap Kansara 26 November 2017 в 14:30

Я не знаю, как вы собираетесь использовать этот скрипт, но это должно начать вас в правильном направлении:

#!/usr/bin/env bash # get the argumetenst from the command line # Sample terminal usage # tostring -p port -n portName -l portLiat -i id echo "" echo "" while getopts :p:n:l:i: option do case "${option}" in p) port=${OPTARG};; n) portName=${OPTARG};; l) portList=${OPTARG};; i) id=${OPTARG};; \?) echo "" echo -e "\e[0;31m Please supply the required values: $OPTARG \e[0m" 1>&2 echo "" echo " Usage: tostring -p port -n portName -l portList -i id" echo "" exit 1 ;; : ) echo "Invalid option $OPTARG requires an argument" 1>&2 ;; esac done shift $((OPTIND -1)) echo "" echo "" echo -e "\e[0;33m public String toString() {" echo -e " return "{ " + "port=" + "$port" + ",portName=" + "$portName" + ",portList=" + "$portList" + ",id=" + "$id" "}";" echo "" echo "" echo -e "}" echo -e "\e[0m"

Дополнительная информация:

https: // sookocheff .com / запись / Баш / разбор-баш-скрипт-аргументы-с-shopts /

1
ответ дан 18 July 2018 в 02:35

Я думаю, что это то, что вы хотите.

#!/bin/bash # Create Java toString() method from stdin. while read line; do word_last="${line##* }" name="${word_last%;}" if [[ $pairs ]]; then printf -v pair '",%s=" + %s + ' "$name" "$name" else printf -v pair '"%s=" + %s + ' "$name" "$name" fi pairs+="$pair" done printf '%s\n' 'public String toString() {' printf ' return "{ " + %s"}";\n' "$pairs" printf '%s\n' '}'

Вызов:

$ bash create_java_toString.sh << EOF > private int port; > private String portName; > private ArrayList portList; > private int id; > EOF public String toString() { return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}"; }

Другие примеры:

$ bash create_java_toString.sh << EOF > private int i; > private int j; > EOF public String toString() { return "{ " + "i=" + i + ",j=" + j + "}"; } $ bash create_java_toString.sh << EOF > EOF public String toString() { return "{ " + "}"; }
3
ответ дан 18 July 2018 в 02:35

Я не знаю, как вы собираетесь использовать этот скрипт, но это должно начать вас в правильном направлении:

#!/usr/bin/env bash # get the argumetenst from the command line # Sample terminal usage # tostring -p port -n portName -l portLiat -i id echo "" echo "" while getopts :p:n:l:i: option do case "${option}" in p) port=${OPTARG};; n) portName=${OPTARG};; l) portList=${OPTARG};; i) id=${OPTARG};; \?) echo "" echo -e "\e[0;31m Please supply the required values: $OPTARG \e[0m" 1>&2 echo "" echo " Usage: tostring -p port -n portName -l portList -i id" echo "" exit 1 ;; : ) echo "Invalid option $OPTARG requires an argument" 1>&2 ;; esac done shift $((OPTIND -1)) echo "" echo "" echo -e "\e[0;33m public String toString() {" echo -e " return "{ " + "port=" + "$port" + ",portName=" + "$portName" + ",portList=" + "$portList" + ",id=" + "$id" "}";" echo "" echo "" echo -e "}" echo -e "\e[0m"

Дополнительная информация:

https: // sookocheff .com / запись / Баш / разбор-баш-скрипт-аргументы-с-shopts /

1
ответ дан 24 July 2018 в 17:36
  • 1
    Я думаю, вы не поняли вопрос правильно. Имя полей не фиксировано. Они будут отличаться для разных классов. – Kashyap Kansara 26 November 2017 в 14:30

Я думаю, что это то, что вы хотите.

#!/bin/bash # Create Java toString() method from stdin. while read line; do word_last="${line##* }" name="${word_last%;}" if [[ $pairs ]]; then printf -v pair '",%s=" + %s + ' "$name" "$name" else printf -v pair '"%s=" + %s + ' "$name" "$name" fi pairs+="$pair" done printf '%s\n' 'public String toString() {' printf ' return "{ " + %s"}";\n' "$pairs" printf '%s\n' '}'

Вызов:

$ bash create_java_toString.sh << EOF > private int port; > private String portName; > private ArrayList portList; > private int id; > EOF public String toString() { return "{ " + "port=" + port + ",portName=" + portName + ",portList=" + portList + ",id=" + id + "}"; }

Другие примеры:

$ bash create_java_toString.sh << EOF > private int i; > private int j; > EOF public String toString() { return "{ " + "i=" + i + ",j=" + j + "}"; } $ bash create_java_toString.sh << EOF > EOF public String toString() { return "{ " + "}"; }
3
ответ дан 24 July 2018 в 17:36
  • 1
    Спасибо, что нашли время ответить на мой вопрос. Ваше решение работает отлично, как ожидалось. И да, я попытался сделать это сам, но не мог идти дальше, чем разделять поля, поскольку я мало знаю о командах. – Kashyap Kansara 26 November 2017 в 13:46

Другие вопросы по тегам:

Похожие вопросы: