[英]JAVA: How to convert String ArrayList to Integer Arraylist?
[英]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;
}
}
為了從String
到Question
,您將必須編寫一個以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
。 您正在生成一個在某種意義上解釋什么是Question
的String
。 例如,您可以覆蓋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.