現在のレイアウトファイルでスピナーを作成しています。このスピナーの内容は、1.0mAから100.0mAまでの範囲です。各増分は0.1mAずつ増加します。文字列配列ファイルに各エントリを手動で入力する以外に、この文字列配列にデータを入力するための何らかのループを作成する方法はありますか?
6 に答える
BigDecimalを使用してこれを行うことができます。これらを1.0から3.0まで画面に出力する例を次に示します。必要に応じて適応できます。
BigDecimalを使用することにより、内部または外部で丸め誤差が発生しなくなります。つまり、将来的に大きな数値に拡張しても、これらの問題が発生することはありません。Big Decimalは、この種の目的のために設計されました。
import java.util.*;
import java.math.*;
class Amps {
public static void main(String[] args) {
List<String> strs = new ArrayList<String>();
BigDecimal max = new BigDecimal("3.0");
BigDecimal inc = new BigDecimal("0.1");
for(BigDecimal cur = new BigDecimal("1.0"); cur.compareTo(max) <= 0; cur = cur.add(inc)) {
strs.add(cur.toString() + "mA");
}
System.out.println(strs);
}
}
速度について疑問がある場合は、BigDecimalを使用する方がフォーマッターを使用するよりも実際に高速です。これは、約1,000,000文字列のサンプルサイズでそれらを前後に実行する小さなテストです。
import java.math.*;
import java.text.*;
import java.util.*;
class Amps {
public static void main(String[] args) {
usingBig();
usingPrim();
usingBig();
usingPrim();
usingBig();
usingPrim();
usingBig();
usingPrim();
usingBig();
usingPrim();
}
static void usingBig() {
long then = System.currentTimeMillis();
List<String> strs = new ArrayList<String>(1000000);
BigDecimal max = new BigDecimal("100000.0");
BigDecimal inc = new BigDecimal("0.1");
for(BigDecimal cur = new BigDecimal("1.0"); cur.compareTo(max) <= 0; cur = cur.add(inc)) {
strs.add(cur.toString() + "mA");
}
long now = System.currentTimeMillis();
System.out.println("Big: " + (now - then));
}
static void usingPrim() {
long then = System.currentTimeMillis();
DecimalFormat formatter = new DecimalFormat("0.0");
List<String> strs = new ArrayList<String>(1000000);
float max = 100000.0f;
float inc = 0.1f;
for(float cur = 1.0f; cur <= max; cur += inc) {
strs.add(formatter.format(cur) + "mA");
}
long now = System.currentTimeMillis();
System.out.println("Prim: " + (now - then));
}
}
結果は次のとおりです。
C:\files\j>java Amps
Big: 1344
Prim: 5172
Big: 1047
Prim: 4656
Big: 1172
Prim: 4531
Big: 1125
Prim: 4453
Big: 1141
Prim: 4547
DecimalFormatterがなくても、プリミティブはBigDecimalよりも低速です。cur + "mA"
DecimalFormatterとそのフォーマット呼び出し(代わりにリストに追加するために使用)をコメントアウトした場合の結果を以下に示します。
C:\files\j>java Amps
Big: 1328
Prim: 1469
Big: 1093
Prim: 1438
Big: 1375
Prim: 1562
Big: 1204
Prim: 1500
Big: 1109
Prim: 1469
SpinnerAdapterを作成し、スピナーに接続します。次に、adapter.add(item1)、adapter.add(item2)などの呼び出しをループできます。
これもチェックしてください:Androidのスピナーにアイテムを追加するにはどうすればよいですか?
例えば、
Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, YOUR_STRING_ARRAY);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
もちろん、次のことができます。
String[] data = new String[991];
int i = 0;
for(float f=1.0f; f<=100.0f; f+=0.1f) {
data[i++] = "" + f + "A";
}
編集:この配列をXMLファイルに入れたい場合は、この配列を1回限りで生成する任意のプログラミング言語を使用できます。たとえば、このJavaコードはあなたに代わってうなり声を上げます。
import java.text.*;
public class T {
public static void main(String[] args) {
DecimalFormat formatter = new DecimalFormat("0.0");
for(float f=1.0f; f<=100.0f; f+=0.1f) {
System.out.println("\"" + formatter.format(f) + "A\",");
}
}
}
コンパイル/実行:javac T.java
その後にjava T > output.txt
。次に、テキストエディタでファイルを開き、output.txt
配列をコピーして貼り付けます。
List<String> list = new ArrayList<String>();
現在使用していますfor loop you can add data in list and set list to spinner..
for(float value=1.0f;value<100.0f;){
String str = String.valueOf(value);
list.add(value+"mA");
value+=0.1f;
}
文字列を生成するループを試してください
List<String> list = new ArrayList<String>();
int endCount = (100. - 1.0) / .1
For(int i = 0; i < endCount; i++){
String stringToAdd = String.format("%.1f mA", 1.0 + ((float)i * 0.1));
// Add stringToAdd to your array
list.add(stringToAdd);
}
次のようなSpinnerAdapterクラスを実装する必要があります。
public class MySpinnerAdapter implements SpinnerAdapter {
private List<String> steps = new ArrayList<String>();
public MySpinnerAdapter(double min,double max,double increment) {
for(double f=min;f < max;f+=increment) steps.add(String.valueOf(f)+" mA");
}
public int getCount() {
return steps.size();
}
public View getView(int position, View convertView, ViewGroup parent) {
TextView t = new TextView(YourActivity.this);
t.setText(steps.get(position));
return t;
}
public boolean isEmpty() {
return (steps.size() == 0);
}
public View getDropDownView(int position, View convertView,ViewGroup paret) {
if(convertView != null) return(convertView);
return(getView(position,convertView,parent));
}
public Object getItem(int position) {
return(steps.get(position));
}
public long getItemId(int position) {
return position;
}
public int getItemViewType(int position) {
return 0;
}
public int getViewTypeCount() {
return 1;
}
public boolean hasStableIds() {
return true;
}
public void registerDataSetObserver(DataSetObserver observer) {
}
public void unregisterDataSetObserver(DataSetObserver observer) {
}
}
次に、このクラスの新しいインスタンスをスピナーに設定する必要があります。
Spinner s = (Spinner) findViewById(R.id.YourSpinnerId);
s.setAdapter(new MySpinnerAdapter(1.0,100.0,0.1));