PG_kura 2012-08-17 13:57:03

[Java] インド人を右に このエントリーをはてなブックマークに追加

投稿者からのアピールポイント

・配列の走査方向をちゃんと考えようぜ。
・近い将来、ジェネリクスを知ったときに赤面するんだろうな。

... あと、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
  }
}

使い方ヒント: 「これは臭う」という行を見付けたら、各行のsmellをクリックしてマーキングしておきましょう(要Twitter OAuth認証)

コメント(6)

#1 math_neko 2012-08-17 14:01:10  

答が偶然にも一致するからバグに気付かないという壮大なオチまでつけてくださりありがとうございます。素晴らしいウンコード。

#2 radicalxxx 2012-08-17 15:14:49  

ArrayListクラスのadd()じゃだめなのかな

#3 InternalServerE 2012-08-17 19:32:28  

ハンドル→インド人
元ネタ知らない人が見たらなんのこっちゃチンプンカンプンでしょうなあ(笑

#4 math_neko 2012-08-18 00:11:05  

ちょっと気になったんだけど、これジェネリクスで書けるの ?

#5 poad1010 2012-08-20 17:19:12  

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)

配列にしなければならないのであれば、引数が入出力なので、配列を逆から舐めるのが手っ取り早いかも…

#6 math_neko 2012-08-22 05:16:11  

あー、私が言いたかったのは右シフトじゃなくて総和の方ね。右シフトは普通に Generics で書けるのはわかるんだけど、総和は無理じゃね ? って言いたかったんです。T extends Number くらいにしても演算メソッドがないしできんやろ ? と思った。

コメント投稿には、twitter認証が必要です。

Twitter認証

このウンコードに臭った人は、こちらのウンコードにも臭ってます

[Java] フルHD推奨。

このエントリーをはてなブックマークに追加

画面の左側がわりと無駄な気がします。

public int hoge(){
    int result = 0;
...

鑑賞する »

[Java] スベテカンスウ

このエントリーをはてなブックマークに追加

何でもやってくれる関数って、便利ですよね...

class Processor
{
	public bool process...

鑑賞する »

[C#] コーディング時最適化

このエントリーをはてなブックマークに追加

最適化の効いた良いコードだと思います。 ...

static void Main() {
    Console.WriteL...

鑑賞する »