0

我正在我当前的布局文件中创建一个微调器,这个微调器的内容范围从 1.0 mA,一直到 100.0mA。每个增量增加 0.1 mA。除了在我的字符串数组文件中手动输入每个条目之外,有没有办法让某种循环来填充这个字符串数组?

4

6 回答 6

2

您可以使用 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 慢。如果我注释掉 DecimalFormatter 及其格式调用(使用而不是cur + "mA"添加到列表中),请参见下面的结果。

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
于 2012-06-22T17:17:21.060 回答
1

创建一个 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);
于 2012-06-22T17:10:18.820 回答
1

当然可以:

String[] data = new String[991];

int i = 0;
for(float f=1.0f; f<=100.0f; f+=0.1f) {
    data[i++] = "" + f + "A";
}

编辑:如果你想把这个数组放在你的 XML 文件中,你可以使用任何你想一次性生成这个数组的编程语言。例如,这个 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在文本编辑器中打开文件并复制/粘贴您的数组。

于 2012-06-22T17:11:06.150 回答
1
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;       
}
于 2012-06-22T17:11:06.580 回答
1

你必须实现一个 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 中设置这个类的一个新实例:

Spinner s = (Spinner) findViewById(R.id.YourSpinnerId);
s.setAdapter(new MySpinnerAdapter(1.0,100.0,0.1));
于 2012-06-22T18:07:59.320 回答
1

尝试生成字符串的循环

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);
}
于 2012-06-22T17:13:17.333 回答