簡體   English   中英

轉換一個ArrayList <String> 到ArrayList <SomeClass> java的

[英]Convert an ArrayList<String> to ArrayList<SomeClass> java

我設法將某個類的arraylist(在我的情況下,它是擴展ArrayAdapter<Question> )轉換為ArrayList<String> 我已經通過android意圖包傳遞了它,並通過getStringArrayList方法接收了它。 現在我需要將其轉換回ArrayList<Question>來設置我的適配器

ArrayList<Question>轉換為ArrayList<String>

       questionlists = task.execute(myitem).get();

        for (Question object : questionlists) 
        {
            strings.add(object != null ? object.toString() : null);
        }
        simpleArray2 = new String[strings.size()];
        strings.toArray(simpleArray2);

轉換回ArrayList<Question>

 List<Question> variable;
 lists = getArguments().getStringArrayList("Question");
     variable = (List<Question>)(List<?>) lists;

  @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.main_world, container, false);
    ListView lv = (ListView) view.findViewById(R.id.list_sessions);
    final QuestionAdapter adapter = new QuestionAdapter(getActivity(), variable);
    lv.setAdapter(adapter);
    //ArrayAdapter<String> adapter = new ArrayAdapter<String>(  
             //inflater.getContext(), android.R.layout.simple_list_item_1,  
             //lists);  
   // lv.setAdapter(adapter);             
    return view;
}

我添加了try / catch我的適配器,但出現錯誤:

無法將java.lang.String強制轉換為java.com.example.Question。

我究竟做錯了什么? 是因為我沒有先轉換回適當的ArrayList嗎?

在第一個示例中,您實際上並沒有將Question強制轉換為String 你調用toString()的方法Question

例如,

public class Question {

    //instance member
    String question;

    public String toString() {
       return question;
    }
}

為了從StringQuestion ,您將必須編寫一個以String為參數並返回一個Question的構造器或方法。

例如,您可以將此構造函數添加到Question類中:

public Question(string myQuestion) {
     question = myQuestion;
}

好的。 要將List<Question>轉換為List<String>您已經執行了以下操作:

從ArrayList轉換為ArrayList

   List<Question> questionlists = task.execute(myitem).get();
   List<String> strings = new ArrayList<String>();

    for (Question object : questionlists) 
    {
        strings.add(object != null ? object.toString() : null);
    }

現在要從List<String>轉換為List<Question>您必須完全相同,反之亦然:

   List<String> strings = ... result from above
   List<Question> questionlists = new ArrayList<Question>();

    for (String object : strings) 
    {
        questionlists.add(object != null ? object.toQuestion() : null);
    }

等一下! String沒有toQuestion()方法! 現在怎么辦? 好吧,我們自己做這種方法。 由於它將成為創建Question對象的方法,為什么不以String為參數將其構造為Question的構造方法呢?

   List<String> strings = ... result from above
   List<Question> questionlists = new ArrayList<Question>();

   for (String object : strings) 
   {
       questionlists.add(object != null ? new Question(object) : null);
   } 

現在剩下要做的就是將構造函數添加到您的問題類中。

class Question {
    public Question(String string) {
        // implementing this the right way is up to you...
    }
}

toString()是所有Java Object對象都具有的方法。 默認情況下,它將列出類的名稱和引用的存儲位置。 您實際上並沒有將對象Question轉換為String 您正在生成一個在某種意義上解釋什么是QuestionString 例如,您可以覆蓋toString()以生成所需的任何內容。

public class Question {

  String mQuestion;

  @Override
  public String toString() {
     return mQuestion;
  }
}

現在,您可以做的是在toString()中創建某種自定義String,以完全表示您的Question對象。 然后有一個fromString方法,用於解析您的自定義String並從中構建新的Question對象。 但是,此方法容易出錯且有局限性。

更好的方法是從Serializable繼承Question ,或者繼承更好的Parcelable 這樣做可以將實際的Question對象放入Bundle並將其從Intent中拉出,而無需進行任何轉換。

您必須正確理解類型轉換。

類型轉換不是轉換。 它要求Java在該上下文的其余部分假設該對象的真實類型就是您所說的。 您正在告訴Java,即使在當前上下文中它並不明顯,您也可以更好地了解對象的實際類型。

並非在每個上下文中都提供有關對象的確切類型的信息。 當您傳遞對象時,方法會將它們視為它們的任何超類類型,直到Object。

類型轉換是一種告訴Java“我已經知道它是一個List <Question>,因為我知道是誰將該對象放在這里”的一種方式。

因此,類型轉換無法幫助轉換。 該對象應該已經是該類型的類型轉換才能起作用。

如果類型不同,則必須編寫代碼將其轉換。

public class ListProcessing {
public static void main(String[] args) {

    List<Integer> ints = Arrays.asList(1,2,3);

    //Take a list, convert and add to new list
    List<String> intStrs = listTransform(ints, new Converter<Integer, String>() {
        @Override
        public String convert(Integer input) {
            return input==null?null:"S"+input.toString();
        }           
    });

    System.out.println(intStrs);
}

//Generic list processor
protected static <T,U> List<U> listTransform(List<T> in, Converter<T,U> converter){
    if(in==null) return null;
    List<U> out = new ArrayList<>();
    for(T item:in){
        out.add(converter.convert(item));
    }
    return out;
}

//An interface for a converter, which converts a single item
private static abstract class  Converter <T,U>{
    public abstract U convert(T input);
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM