質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

2回答

1591閲覧

Javaで書いたコードをRubyで書きたい

minokiti

総合スコア45

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

1グッド

2クリップ

投稿2020/03/30 02:44

Javaで書いたコードをRubyで書きたい

Javaで書いた動的計画法(ナップザック問題)のコードをRubyで書きたいです。

Java

1public class KnapsackDP { 2 // ナップザックの耐重量 3 public static final int KNAP_MAX = 6; 4 5 // 品物の種類 6 public static final int ITEM_NUM = 5; 7 8 // 品物の名称 9 public static char[] name = { 'A', 'B', 'C', 'D', 'E' }; 10 11 // 品物の重量 12 public static int[] weight = { 1, 2, 3, 4, 5 }; 13 14 // 品物の価値 15 public static int[] value = { 100, 300, 350, 500, 650 }; 16 17 // 品物を吟味した直後の価値 18 public static int[][] maxValue = new int[ITEM_NUM][KNAP_MAX + 1]; 19 20 // 最後に入れた品物 21 public static int[] lastItem = new int[KNAP_MAX + 1]; 22 23 // item番目の品物を吟味した直後のナップザックの内容を表示するメソッド 24 public static void showKnap(int item) { 25 int knap; // 0kg~6kgのナップザックを指す 26 27 // 吟味した品物の情報を表示する 28 System.out.printf("<%c, %dkg, %d円を吟味した結果>\n", 29name[item], weight[item],value[item]); 30 31 // ナップサックの耐重量を表示する 32 for (knap = 0; knap <= KNAP_MAX; knap++) { 33 System.out.printf("%dkg¥t", knap); 34 } 35 System.out.printf("\n"); 36 37 // ナップザックに詰められた品物の価値の合計を表示する 38 for (knap = 0; knap <= KNAP_MAX; knap++) { 39 System.out.printf("%d円¥t", maxValue[item][knap]); 40 } 41 System.out.printf("\n"); 42 43 // ナップザックに最後に入れた品物を表示する 44 for (knap = 0; knap <= KNAP_MAX; knap++) { 45 if (lastItem[knap] != -1) { 46 System.out.printf("%c¥t", name[lastItem[knap]]); 47 } 48 else { 49 System.out.printf("なし¥t"); 50 } 51 } 52 System.out.printf("¥n¥n"); 53 } 54 55 // プログラムの実行開始位置となるmainメソッド 56 public static void main(String[] args) { 57 int item; // 品物の番号 58 int knap; // 0kg~6kgのナップザックを指す 59 int selVal; // 仮に選んだ場合の価値の合計値 60 int totalWeight; // 重量の合計値 61 62 // 0番目の品物を吟味する 63 item = 0; 64 // 0kg~KNAP_MAXkgのナップザックで吟味する 65 for (knap = 0; knap <= KNAP_MAX; knap++) { 66 // 耐重量以下なら選ぶ 67 if (weight[item] <= knap) { 68 maxValue[item][knap] = value[item]; 69 lastItem[knap] = item; 70 } 71 // 耐重量以下でないなら選ばない 72 else { 73 maxValue[0][knap] = 0; 74 lastItem[knap] = -1; 75 } 76 } 77 showKnap(item); 78 79 // 1番目~ITEM_NUM-1番目の品物を吟味する 80 for (item = 1; item < ITEM_NUM; item++) { 81 // 0kg~KNAP_MAXkgのナップザックで吟味する 82 for (knap = 0; knap <= KNAP_MAX; knap++) { 83 // 耐重量以下の場合 84 if (weight[item] <= knap) { 85 // 選んだ場合の価値を求めてみる 86 selVal = maxValue[item - 1][knap - weight[item]] + value[item]; 87 // 価値が大きくなるなら選ぶ 88 if (selVal > maxValue[item - 1][knap]) { 89 maxValue[item][knap] = selVal; 90 lastItem[knap] = item; 91 } 92 // 価値が大きくならないなら選ばない 93 else { 94 maxValue[item][knap] = maxValue[item - 1][knap]; 95 } 96 } 97 // 耐重量以下でないなら選ばない 98 else { 99 maxValue[item][knap] = maxValue[item - 1][knap]; 100 } 101 } 102 showKnap(item); 103 } 104 105 // ナップザックに入っている品物を調べて、解を表示する 106 System.out.printf("<ナップザックに入っている品物を調べる>¥n"); 107 totalWeight = 0; 108 for (knap = KNAP_MAX; knap > 0; knap -= weight[item]) { 109 item = lastItem[knap]; 110 System.out.printf("%dkgのナップザックに入れた品物は%cです。¥n", knap, name[item]); 111 totalWeight += weight[item]; 112 System.out.printf("%c, %dkg, %d円¥n", name[item], weight[item], value[item]); 113 System.out.printf("%dkg - %dkg = %dkgです。¥n", knap, weight[item], knap - weight[item]); 114 } 115 System.out.printf("¥n<解を表示する>¥n"); 116 System.out.printf(" 重量の最大値 = %dkg¥n", totalWeight); 117 System.out.printf("価値の最大値 = %d円¥n", maxValue[ITEM_NUM - 1][KNAP_MAX]); 118 } 119}

どんな小さなことでもいいので、少しでもアドバイスしてもらえたら幸いです。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/03/30 02:48

できれば、まず、自分でできるところまで書いてもらった方が。 なにも書いてないならアドバイスしようがないところもあります。質問者がどの程度できるかとか、知ってるかとか、そういう情報もないので
ozwk

2020/03/30 02:48

何に困っているんですか?
maisumakun

2020/03/30 02:49

そもそも論ですが、Rubyで書き直したい理由は何でしょうか?(状況によっては「元のコードはJavaのまま、RubyのコードをJRubyで実行することで連携する」という選択も可能です)
gentaro

2020/03/30 02:50

ここに書かれている内容でアドバイスをするとしたら「Rubyの入門書を読むところから始めましょう」以上の回答はない気がするんですが。
minokiti

2020/03/30 02:56

Javaは全く触れたことがなくて、どの行が何をしているのかが分からないので、変数の宣言と初期化の両立はこうやってやる、みたいなことを知りたいです。
m.ts10806

2020/03/30 03:00

でも結局Rubyで組むのでしたらアルゴリズムや設計だけ持ってきてJavaのコードは忘れた方が良いのでは?
minokiti

2020/03/30 03:01

すみません。では、showKnapメソッドの「int knap;」は、Rubyでどのように書けば良いのでしょうか。
kaina

2020/03/30 03:02

Javaで書いたコードということなので、Javaのコードはご自分で書いたものなのでしょう。 なので、Javaのコードは全て理解出来ているはずです。 であれば後はRubyの基礎(for文、if文、配列操作、関数等)が分かれば出来るのでは?
minokiti

2020/03/30 03:08 編集

すみません。Javaは触れたことがなくて、このコードは僕が書いたコードではないです。Rubyは大体分かります。
gentaro

2020/03/30 03:09

Rubyに明示的な変数宣言がないことも知らないようなら、Rubyも触れたことが無いんですよね? ならやっぱり「Rubyの入門書を読むところから始めましょう」以上の回答はない気がするんですが。 Rubyの文法を1から10まで質問するつもりですか?
otn

2020/03/30 03:14

まずは書いてみましょう。
minokiti

2020/03/30 03:31 編集

class KnapsackDP KNAP_MAX = 6 ITEM_NUM = 5 name = ["A","B","C","D","E"] weight = [1,2,3,4,5] value = [100,200,300,350,500,650] max_Value = [[ITEM_NUM],[KNAP_MAX + 1]] last_Item = [KNAP_MAX + 1] def showKnap(int, item) end end 今ここまで出来たのですが、「int knap;」の部分をRubyでどうやって書けばいいのか分かりません。
miyabi_takatsuk

2020/03/30 03:44 編集

ま、まさか、今まで型指定しないで、変数とかメンバの宣言してたんですか? Rubyやっておきながら。 記載のコードは全部型推論で宣言してるようなので、心配になりました。 型に関しては、理解されておりますか??
miyabi_takatsuk

2020/03/30 04:32 編集

失礼しました、Rubyは動的型付けでしたね、すみません。勘違いしてました。 型に関する理解があれば、 int knap;をRubyでどう宣言すればいいかは自ずと答えが出るかと思います。 なので、型に関しての理解を聞きました。 Javaは静的型付けなので、型に関して理解ないと、翻訳は難しいかと思います。
otn

2020/03/30 05:19

自分で書いてないと言うことは、タイトルが間違っていたと言うことですね。 誤:Javaで書いたコードをRubyで書きたい 正:Javaで書かれたコードをRubyで書きたい
minokiti

2020/03/30 09:33

ありがとうございました。もう一度自分で整理してみます
guest

回答2

0

Rubyでそのアルゴリズムを実装します。
RubyがわからなければRubyを勉強します。
アルゴリズムが不明ならそのアルゴリズムを調査するか、Javaでの実装コードから読み解きます。
JavaがわからなければJavaを勉強します。

プログラムの"翻訳"は結構難しいです。というのも、
プログラミング言語が変わると、片方の言語で存在する機能が、

  • 概念自体存在しないので考え方自体変える必要がある
  • 標準機能では存在しないので、自分で実装する必要がある
  • うまいこと取り扱ってくれるのでわざわざ書く必要がなくなる
  • もっと簡潔に書ける

といった面倒事が起こるので、両方の言語についてある程度わかってないといけません。

投稿2020/03/30 03:45

ozwk

総合スコア13553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

結局Rubyで組むのでしたらアルゴリズムや設計だけ持ってきてJavaのコードは忘れた方が良いのでは?

あくまで言語は実現のための手段、道具にしか過ぎないので、単なる翻訳を考えるのは無理があります。

結局、Javaで実現されている機能を理解できてないとRubyでも作ることはできませんし、もともとの設計があるはずです。

私でしたら、コードは忘れて設計とアルゴリズムのみを参考に1から作ります。
Javaのコードはノイズにしか感じません。
やることは「目的の達成」であって、「Javaのコードを別言語に書き換える」ことではないからです。
参考にするのは「どういうインプットに対してどういうアウトプットになるか」のみ。

投稿2020/03/30 05:20

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問