【问题标题】:Populate a string-array without having to enter every entry无需输入每个条目即可填充字符串数组
【发布时间】:2012-06-25 00:44:50
【问题描述】:

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

【问题讨论】:

  • 这是一次性的吗?
  • 对不起,我不知道这是什么意思

标签: android arrays


【解决方案1】:

创建一个 SpinnerAdapter 并将其连接到您的微调器。然后就可以循环调用adapter.add(item1)、adapter.add(item2)等...

也请查看:How can I add items to a spinner in 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);

【讨论】:

  • 你能告诉我你告诉我使用的代码吗?我认为这个答案有效,但我无法正确初始化 SpinnerAdapter
  • 谢谢,YOUR_STRING_ARRAY 需要是一个实际的字符串数组,还是我可以使用另一个容器,例如字符串的 ArrayList?
  • 另外,android.r.layout.LAYOUT,我在这个布局中有大约 8 个微调器。没关系吗?
  • 您应该可以使用 ArrayList。查看developer.android.com/reference/android/widget/… 获取文档。看起来您可以将任何类型的列表传递给它。您的布局有多个微调器并不重要...只需使用 adapter.setDropDownViewResource() 选择您想要的。
  • 您是否有机会澄清 'android.R.layout.LAYOUT' 和 'android.R.layout.SPINNER' 调用?
【解决方案2】:

当然可以:

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 &gt; output.txt。现在打开output.txt 文件 文本编辑器并复制/粘贴您的数组。

【讨论】:

  • 这将如何填充微调器?
  • 我不会在我的 .java 文件中这样做,我会在我的 .xml 文件中这样做。
  • @user1454749 请仔细阅读问题:OP 不是要求填充微调器,而是在循环中填充数组,这样他就不必手动输入所有值
  • @JuiCe 你想一次性做到这一点吗?
  • 是的,我也把它当作一次性的。就此而言,他可以将类似的生成代码放入他的应用程序中,运行一次,然后将其从 LogCat 中复制出来 :)
【解决方案3】:
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;       
}

【讨论】:

    【解决方案4】:

    尝试生成字符串的循环

    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);
    }
    

    【讨论】:

    【解决方案5】:

    您可以使用 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
    

    【讨论】:

    • 有趣的方法,想知道速度,因为这很可能是一个大数字库的实现。一般来说,这些往往相当缓慢。不过我喜欢它,开箱即用:-)
    • @trumpetlicks 正如我编辑中的示例所示,BigDecimal 类实际上比 DecimalFormatter 更快(你需要让你的数字正确显示,因为你需要很多数字遇到不能用浮点数精确表示。)
    • @trumpetlicks 更新:即使没有 DecimalFormatter,BigDecimal 仍然比 float
    • @ 重要信息 - 感谢更新和数据。我已经在 C/C++ 中实现了我自己的大部分 big-num 库。我认为这可以通过低字符数来实现,但是很高兴看到您的数据,谢谢您:-) +1
    【解决方案6】:

    你必须实现一个 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));
    

    【讨论】:

    • SDK 中尚未包含此实现?
    • 实际上你必须自己实现,因为视图可能会根据你的应用而改变。这个link 展示了更多自定义布局的示例。
    猜你喜欢
    • 2021-02-10
    • 2015-05-22
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多