2013-07-13 3 views
0

Я пытаюсь случайно выбрать строку из массива и выплюнуть ее пользователю, но всякий раз, когда я пытаюсь запустить ее через AVD, приложение падает. Я очень начинаю в этом и не могу понять, что делать.Android: случайный выбор строк из массива

Вот мой код:

public class MainActivity extends Activity { 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    final LinearLayout rr = new LinearLayout (this); 

    // setting up the LinearLayout. I'll get to proper formatting one I get the code running. 
    Button b1 = new Button (this); 
    b1.setId(R.id.Button01); 
    b1.setText("Generate"); 
    rr.addView(b1); 
    final TextView tv; 
    tv = new TextView(this); 
    tv.setId(R.id.Text1); 
    rr.addView(tv); 
    setContentView(rr); 

    final String [] columnA = { "artless", "bawdy", "beslubbering", "bootless", "churlish", "cockered", "clouted", "craven", "currish", "dankish", "dissembling", "droning", "errant", "fawning", "fobbing", "froward", "frothy", "gleeking", "goatish", "gorbellied", "impertinent", "infectious", "jarring", "loggerheaded", "lumpish", "mammering", "mangled", "mewling", "paunchy", "pribbling", "puking", "puny", "qualling", "rank", "reeky", "roguish", "ruttish", "saucy", "spleeny", "spongy", "surly", "tottering", "unmuzzled", "vain", "venomed", "villainous", "warped", "wayward", "weedy", "yeasty" }; 
    final String [] columnB = { "base-court", "bat-fowling", "beef-witted", "beetle-headed", "boil-brained", "clapper-clawed", "clay-brained", "common-kissing", "crook-patted", "dismal-dreaming", "dizzy-eyed", "doghearted", "dread-boiled", "earth-vexing", "elf-skinned", "fat-kidneyed", "fen-sucked", "flap-mouthed", "fly-bitten", "folly-fallen", "fool-born", "full-gorged", "guts-gripping", "hasty-witted", "half-faced", "hell-hated", "idle-headed", "ill-breeding", "ill-nurtured", "knotty-pated", "milk-livered", "motley-minded", "onion-eyed", "plume-plucked", "pottle-deep", "pox-marked", "reeling-riped", "rough-hewn", "rude-growing", "rump-fed", "shard-borne", "sheep-biting", "spur-galled", "swag-bellied", "tardy-gaited", "tickle-brained", "toad-spotted", "unchin-snouted", "weather-bitten"}; 
    final String [] columnC = { "apple-john", "baggage", "barnacle", "bladder", "boar-pig", "bugbear", "bum-bailey", "canker-blossom", "clack-dish", "clotpole", "coxcomb", "codpiece", "death-token", "dewberry", "flap-dragon", "flax-wench", "flirt-gill", "foot-licker", "fustilarian", "giglet", "gudgeon", "haggard", "harpy", "hedge-pig", "horn-beast", "hugger-mugger", "joithead", "lewdster", "lout", "maggot-pie", "malt-worm", "mammet", "measle", "minnow", "miscreant", "moldwarp", "mumble-news", "nut-hook", "pigeon-egg", "pignut", "puttock", "pumpion", "ratsbane", "scut", "skainsmate", "strumpet", "varlot", "vassal", "whey-face", "wagtail"}; 

    //Attempts to pick one string from each array, add "thou art a" and spaces, and display it to the device. 
    b1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      String outputA; 
      Random r; 
      r = new Random(columnA.length); 
      Random s; 
      s = new Random(columnB.length); 
      Random t; 
      t = new Random(columnC.length); 
      outputA = "Thou art a" + " " + columnA[r.nextInt() % columnA.length] + " " + columnB[s.nextInt() % columnB.length] + " " + columnC[t.nextInt() % columnC.length]; 
      tv.setText(outputA); 
     } 
    }); 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 
+1

Я настоятельно рекомендую вы читаете документацию для конструктора 'Random' и' nextInt'. Они не делают того, что, по вашему мнению, делают. –

+0

Как сообщает @JonSkeet, проверьте документацию. Параметр, переданный конструктору Random, является семенем для генератора случайных чисел. Вы можете оставить этот параметр, поскольку Random будет использовать семя «достаточно хорошо» для того, что вы пытаетесь сделать. Вы передаете диапазон для случайного числа при следующем вызове. – HeatfanJohn

+0

Вы также должны опубликовать трассировку стека logcat при запросе о сбое. Он точно определяет, в чем проблема. – Simon

ответ

2

Я полагаю, вы были получать ArrayIndexOutOfBoundsException

Чтобы решить, удалить все Random с и изменить ваш onClickListener на:

b1.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     String outputA = "Thou art a" + " " + columnA[(int) (Math.random() * columnA.length)] + " " + columnB[(int) (Math.random() * columnB.length)] + " " + columnC[(int) (Math.random() * columnC.length)]; 
     tv.setText(outputA); 
    } 
}); 
+0

Благодарю вас! Оно работает! – user2540201

+0

При использовании 'Math.random()' работает, это не так чисто (IMO) как использование 'Random', но делает это правильно. –

+0

@JonSkeet Fair dos. Иногда все люди хотят своевременного решения :) –

Смежные вопросы