・配列の走査方向をちゃんと考えようぜ。
・近い将来、ジェネリクスを知ったときに赤面するんだろうな。
... あと、double 版では昭和か平成にでもなるんでしょうかね。
class Utils
{
/**
* int 配列の要素の総和を求める。
*
* @param arr 計算対象の配列
*/
public static int sum(int[] arr)
{
int sum = 0;
for(int i: arr) {
sum += i;
}
return sum;
}
/**
* int 配列の要素の位置を、ひとつずつ後ろにずらす。
* 配列の先頭要素の値はそのままとする。
*
* @param arr 処理大正となる配列
*/
public static void shiftRight(int[] arr)
{
for(int i = 0; i < arr.length - 1; ++i) {
// ↓ここで i + 1 しているので、ループ条件を i < arr.length - 1 にするのが重要!
arr[i + 1] = arr[i];
}
}
// TODO long 版, double 版も用意すること
}
class Main {
public static void main(String args[])
{
// 適当な配列でテストしてみる。
int[] arr = { 2, 1, 3, 4 };
System.out.println(Utils.sum(arr)); // 2 + 1 + 3 + 4 => 10
Utils.shiftRight(arr);
System.out.println(Utils.sum(arr)); // 2 + 2 + 1 + 3 => 8
}
}
ArrayListクラスのadd()じゃだめなのかな
ハンドル→インド人
元ネタ知らない人が見たらなんのこっちゃチンプンカンプンでしょうなあ(笑
Genericsだとこんな感?(適当に書いたので、インデックス間違ってるかも知れないけど)
List<Integer> list = Arrays.asList(arr); for (int elem : arr) { list.add(elem); } list.add(0, arr[arr.length -1]); list.remove(list.size() -1);
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/List.html#add(int, E)
配列にしなければならないのであれば、引数が入出力なので、配列を逆から舐めるのが手っ取り早いかも…
あー、私が言いたかったのは右シフトじゃなくて総和の方ね。右シフトは普通に Generics で書けるのはわかるんだけど、総和は無理じゃね ? って言いたかったんです。T extends Number くらいにしても演算メソッドがないしできんやろ ? と思った。
答が偶然にも一致するからバグに気付かないという壮大なオチまでつけてくださりありがとうございます。素晴らしいウンコード。