【问题标题】:String ArrayList using Collections使用集合的字符串 ArrayList
【发布时间】:2013-02-25 22:37:02
【问题描述】:

我的主要activity 有多个ArrayListsArrays。当您单击 Smoked Cigarette 按钮时,应用程序会在 ArrayList 中记录某些信息。 ArrayListslocationsSmoked 之一包含您吸烟的所有地点。我的任务是制作一个activity,在ListView 中显示您吸烟的位置,以及您在那里吸烟的次数。 如果您当前显示locationsSmoked array,它将如下所示

首页
首页
首页
工作
工作
学校
学校

等等等等。我需要遍历这个array 以显示每个string 被调用的次数并给出integer 值。然后我需要将integer 与匹配的string 结合起来。在并行array 或多维array 中显示信息在另一个activity 名为 Locations 的activity 的列表视图中 所以它看起来像这样

首页:3
工作:2
学校:2

应该注意的是,即使您永远不应该对元素进行硬编码,但在这种情况下,我实际上是不允许这样做的,因为位置的ArrayList 将不断增长。我已经完成了另一个activity,它允许用户将新位置添加到现有ArrayList 我认为我将在下面列出的来自我的 model.java 和我的 locations.java 的代码大部分是准确的。但是,当我转到 activity 时,listview 中没有显示任何内容。

因此,如果这有任何令人困惑的地方,请告诉我,我会更具体地询问。

感谢您提供的任何帮助。

模型.java

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.GregorianCalendar;

public class Model implements Serializable {
public static final int END_MORNING = 11;  // 11:00AM, inclusive
public static final int END_AFTERNOON = 16;  // 4:00PM, inclusive
private int locNumber;
private String locName;

private GregorianCalendar startDate;

private ArrayList<GregorianCalendar> datesSmoked = new ArrayList<GregorianCalendar>();
private ArrayList<String> locationsSmoked = new ArrayList<String>();
private ArrayList<String> locations = new ArrayList<String>();
private ArrayList<String> allIncidents = new ArrayList<String>();
private ArrayList<String> test  = new ArrayList<String>();

public String [] defaultLocations = {"Home", "Work", "Commuting", "School", "Bar", "Restaurant", "Social Gathering", "Other"};
public String [] eachSmoked;


public Model(GregorianCalendar date){
    startDate = date;

    for (String s : this.defaultLocations) {            
        locations.add(s);
    }           
}

public Model(){
    this(new GregorianCalendar()); // now
}   


public void setAllIncidentsArray() {        
    this.allIncidents.add(datesSmoked.toString());
    this.allIncidents.add(locationsSmoked.toString());
}

public void setEachSmoked() {
    for (int i = 0; i < locationsSmoked.size(); i++) {
        locNumber = Collections.frequency(locationsSmoked, locationsSmoked.get(i));
        locName = locations.get(i);
        test.add(i, locNumber + locName);
    }
}

public ArrayList<String> getEachSmoked() {              
    return this.test;
}

public ArrayList<String> getAllIncidentsArray() {
    return this.allIncidents;
}

public ArrayList<String> getlocationsArray() {
    return this.locations;
}

public ArrayList<String> getLocationsSmokedArray() {
    return this.locationsSmoked;
}

public ArrayList<GregorianCalendar> getDatesSmokedArray() {
    return this.datesSmoked;
}

public void incrementCount(String location) {   
    this.datesSmoked.add(new GregorianCalendar());  // now
    this.locationsSmoked.add(location);     
}

public int getTodayCount() {
    GregorianCalendar now = new GregorianCalendar();
    int todayDayOfYear = now.get(Calendar.DAY_OF_YEAR);

    int count = 0;
    for (GregorianCalendar day : this.datesSmoked)
        if (day.get(Calendar.DAY_OF_YEAR) == todayDayOfYear)
            count++;

    return count;
}

public int getTotalCount() {
    return this.datesSmoked.size();
}

public double getAverage() {
    if (getDays() > 0)
        return (double) getTotalCount() / getDays();
    else
        return 0.0;
}

public int getDays() {
    return (new GregorianCalendar()).get(Calendar.DAY_OF_YEAR) - startDate.get(Calendar.DAY_OF_YEAR) + 1;
}

public int getMorning() {
    int count = 0;
    for (GregorianCalendar date : this.datesSmoked)
        if (date.get(Calendar.HOUR_OF_DAY) <= END_MORNING)
            count++;

    return count;
}

public int getAfternoon() {
    int count = 0;
    for (GregorianCalendar date : this.datesSmoked)
        if (date.get(Calendar.HOUR_OF_DAY) > END_MORNING && date.get(Calendar.HOUR_OF_DAY) <= END_AFTERNOON)
            count++;

    return count;
}

public int getEvening() {
    int count = 0;
    for (GregorianCalendar date : this.datesSmoked)
        if (date.get(Calendar.HOUR_OF_DAY) > END_AFTERNOON)
            count++;

    return count;
}
}

Locations.java(位置活动)

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class LocationActivity extends Activity {

public static final String SMOKIN_DATA_FILE = "smokin.dat";

public static Model model = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_location);

    restoreModel();

    ListView listView = (ListView) findViewById(R.id.location_listview_Id);
    ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, model.getEachSmoked());        
    listView.setAdapter(listAdapter);       
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_location, menu);
    return true;
}

public void restoreModel() {
    // Restore from disk, or start with an empty model
    try {
        ObjectInputStream ois = new ObjectInputStream(
                openFileInput(SMOKIN_DATA_FILE));

        model = (Model) ois.readObject();
        ois.close();
    } catch (Exception e) {
        Log.v("*** DEBUG ***", "Error writing to file: " + e);
        model = new Model();
    }
}    

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {

    case R.id.menu_home_Id:
        Intent homeIntent = new Intent(this, MainActivity.class);
        startActivity(homeIntent); ;
        return true;

    case R.id.menu_all_incidents_Id:
        Intent allIncidentsIntent = new Intent(this, AllIncidentsActivity.class);
        startActivity(allIncidentsIntent); ;
        return true;

    case R.id.menu_edit_locations_Id:
        Intent editLocationsIntent = new Intent(this, EditLocationsActivity.class);
        startActivity(editLocationsIntent); ;
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }

}
}

【问题讨论】:

  • @User117 我很乐意,不幸的是,这个作业不允许这样做

标签: android arraylist android-listview


【解决方案1】:

这看起来是使用Hashtable&lt;String, Integer&gt; 的完美机会,哈希表将包含位置作为键和计数作为值。

现在,当您为 ListView 生成数据时,只需在 ArrayList 元素上迭代熏过的地方,如果该元素不在 HashTable 中,请将其添加并将 Value 设置为 0。如果它已经在其中,只需将其加一.

最后,您有一个 HashTable,其中包含您需要的所有数据。

【讨论】:

  • 非常感谢,在接受答案之前,我将尝试您的解决方案和 user370305 的解决方案。
  • 我从未使用过HashTables,我查看了文档,老实说有点令人困惑。您的回答似乎完全可以满足我的需求。你愿意发布一个关于如何实现它的快速伪代码示例吗?我有点困惑是否需要取出我的ArrayList,或者覆盖它,以及这将如何影响我仍在使用ArrayListactivities 的其余部分
  • 所以我搜索了hashtable 完全按照您的建议执行的示例,并获得了我的伪代码here 的奖励。我足智多谋,最后的评论对你不公平,艾哈迈德,你不应该再做工作了。那是一个非常好的答案。接受并感谢!
  • 真的没问题,我很乐意用一些伪代码帮助你。碰巧你发表评论的时候在我家已经是午夜了。无论如何,我很高兴你解决了你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2014-04-15
  • 2010-10-11
  • 2016-02-06
相关资源
最近更新 更多