【问题标题】:Get index first and last same item in ArrayList?在ArrayList中获取索引第一个和最后一个相同的项目?
【发布时间】:2016-12-23 04:42:00
【问题描述】:

我有一个模型:

public class Unprocessed_DistanceTime_D {
    private String lat;
    private String lng;
    private String date;
    private String time;
    private String counts;
    private String userCode;

    public String getLat() {
        return lat;
    }

    public void setLat(String lat) {
        this.lat = lat;
    }

    public String getLng() {
        return lng;
    }

    public void setLng(String lng) {
        this.lng = lng;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public String getCounts() {
        return counts;
    }

    public void setCounts(String counts) {
        this.counts = counts;
    }

    public String getUserCode() {
        return userCode;
    }

    public void setUserCode(String userCode) {
        this.userCode = userCode;
    }
}

我用下面的数据填充我的模型:

     DATE      TIME       LAT            LNG         COUNT 
1395/04/26    12:13:44    34.6117392    50.8548033    7
1395/04/26    12:13:49    34.6117392    50.8548033    7
1395/04/26    12:13:58    34.6117392    50.8548033    7
1395/04/26    12:14:00    34.6117392    50.8548033    7
1395/04/26    12:14:22    34.6117392    50.8548033    7
1395/04/26    12:14:44    34.6117392    50.8548033    7
1395/04/26    12:14:49    34.6117392    50.8548033    7
1395/04/26    12:14:58    34.6113533    50.8551068    27
1395/04/26    12:14:58    34.6113533    50.8551068    27
1395/04/26    12:15:00    34.6113533    50.8551068    27
1395/04/26    12:15:22    34.6113533    50.8551068    27
1395/04/26    12:15:35    34.6322184    50.8596414    9
1395/04/26    12:15:44    34.6113533    50.8551068    27
1395/04/26    12:15:49    34.6113533    50.8551068    27
1395/04/26    12:15:58    34.6113533    50.8551068    27
1395/04/26    12:15:58    34.6113533    50.8551068    27
1395/04/26    12:16:00    34.6113533    50.8551068    27
1395/04/26    12:16:09    34.6322184    50.8596414    9
1395/04/26    12:16:22    34.6113533    50.8551068    27
1395/04/26    12:16:44    34.6113533    50.8551068    27
1395/04/26    12:16:49    34.6113533    50.8551068    27
1395/04/26    12:16:58    34.6113533    50.8551068    27
1395/04/26    12:16:58    34.6113533    50.8551068    27
1395/04/26    12:17:00    34.6113533    50.8551068    27
1395/04/26    12:17:22    34.6113533    50.8551068    27
1395/04/26    12:17:44    34.6113533    50.8551068    27
1395/04/26    12:17:49    34.6113533    50.8551068    27
1395/04/26    12:17:58    34.6113533    50.8551068    27
1395/04/26    12:17:58    34.6113533    50.8551068    27
1395/04/26    12:18:00    34.6113533    50.8551068    27
1395/04/26    12:18:22    34.6113533    50.8551068    27
1395/04/26    12:18:38    34.6322184    50.8596414    9
1395/04/26    12:18:44    34.6113533    50.8551068    27
1395/04/26    12:18:49    34.6113533    50.8551068    27
1395/04/26    12:18:51    34.6322184    50.8596414    9
1395/04/26    12:18:58    34.6113533    50.8551068    27
1395/04/26    12:18:58    34.6113533    50.8551068    27
1395/04/26    12:19:00    34.6113533    50.8551068    27
1395/04/26    12:19:01    34.6113415    50.8562128    22
1395/04/26    12:19:22    34.6113415    50.8562128    22
1395/04/26    12:19:44    34.6113415    50.8562128    22
1395/04/26    12:19:49    34.6113415    50.8562128    22
1395/04/26    12:19:58    34.6113415    50.8562128    22
1395/04/26    12:19:58    34.6113415    50.8562128    22
1395/04/26    12:20:00    34.6113415    50.8562128    22
1395/04/26    12:20:01    34.6113415    50.8562128    22
1395/04/26    12:21:41    34.6322184    50.8596414    9
1395/04/26    12:22:32    34.6113415    50.8562128    22
1395/04/26    12:22:36    34.6322184    50.8596414    9
1395/04/26    12:25:00    34.6113415    50.8562128    22
1395/04/26    12:25:04    34.6113415    50.8562128    22
1395/04/26    12:25:13    34.6113415    50.8562128    22
1395/04/26    12:25:13    34.6113415    50.8562128    22
1395/04/26    12:25:16    34.6113415    50.8562128    22
1395/04/26    12:25:16    34.6113415    50.8562128    22
1395/04/26    12:25:37    34.6113415    50.8562128    22
1395/04/26    12:25:37    34.6322184    50.8596414    9
1395/04/26    12:26:00    34.6113415    50.8562128    22
1395/04/26    12:26:04    34.6113415    50.8562128    22
1395/04/26    12:26:13    34.6113415    50.8562128    22
1395/04/26    12:26:20    34.6113415    50.8562128    22
1395/04/26    12:26:38    34.6113415    50.8562128    22
1395/04/26    12:26:38    34.6322184    50.8596414    9
1395/04/26    12:26:39    34.6113415    50.8562128    22
1395/04/26    12:29:46    34.6322184    50.8596414    9

我写了下面的代码,但不适用于我获取相同的第一个和最后一个项目的索引,我使用你的代码,但我无法得到真正的答案。 我的数据是排序基准时间,我不喜欢更改它我应该在不更改的情况下处理这些数据。

我的代码在这里:

public class ComputeDetailMoreActivity_E extends AppCompatActivity {
    Context context;

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_computedetailmore);
            int count = 1;
            int X = 2;
            boolean flag = true;
            int index1 = -1;
            int index2 = -1;
            Integer counter = 0;
            for (int i = 0; i < listCDM.size() - 1; i++) {
                if (listCDM.get(i).getDate().equalsIgnoreCase(listCDM.get(count).getDate()) &&
                        listCDM.get(i).getLat().equalsIgnoreCase(listCDM.get(count).getLat()) &&
                        listCDM.get(i).getLng().equalsIgnoreCase(listCDM.get(count).getLng()) &&
                        listCDM.get(i).getCounts().equalsIgnoreCase(listCDM.get(count).getCounts())) {
                    if (flag) {
                        index1 = i;
                        flag = false;
                        counter++;
                    }
                } else {
                    if (X < listCDM.size()) {
                        if (!listCDM.get(count).getLat().equalsIgnoreCase(listCDM.get(X).getLat()) &&
                                !listCDM.get(count).getLng().equalsIgnoreCase(listCDM.get(X).getLng()) &&
                                !listCDM.get(count).getCounts().equalsIgnoreCase(listCDM.get(X).getCounts())||
                                !listCDM.get(count).getDate().equalsIgnoreCase(listCDM.get(X).getDate())) {

                            Log.i("ADFASFEWRWE", "C : " + listCDM.get(X).getCounts() + "**" +
                                    listCDM.get(X).getTime());
                            index2 = i;
                            Log.i("ASDASRDWE",i + "");
                            int error = count;
                            counter = 2;
                        }
                        if (listCDM.get(count).getLat().equalsIgnoreCase(listCDM.get(X).getLat()) &&
                                listCDM.get(count).getLng().equalsIgnoreCase(listCDM.get(X).getLng()) &&
                                listCDM.get(count).getCounts().equalsIgnoreCase(listCDM.get(X).getCounts()) &&
                                listCDM.get(count).getDate().equalsIgnoreCase(listCDM.get(X).getDate())) {

                            index2 = i;
                            flag = true;
                            counter++;
                        }
                        Log.i("RRTTGGTT", counter + "");
                        if (counter == 2) {
                            Log.i("ASDWERWEDAVVGG", index1 + " : " + index2);
                            flag = true;
                            counter = 0;
                            index1 = -1;
                            index2 = -1;
                        }
                    }
             }
             count++;
              X++;

             }

      }
}

我的输出是:

7 : 6
7 : 10
12 : 16
18 : 30
32 : 33
38 : 45
-1 : 46
-1 : 47
49 : 55
57 : 61
-1 : 62

【问题讨论】:

  • 您的问题不清楚,请描述您的需求
  • 请提供您目前尝试过的代码。 SO不是一些代码提供网站。它是一个解决问题的平台
  • 这似乎是一个纯 Java 问题,因此这里不需要 Android 标签。
  • @EJK 。我在 android studio 工作。
  • 这不会以任何方式影响解决方案。无论您使用哪种 IDE,代码都是相同的。

标签: java loops for-loop arraylist foreach


【解决方案1】:

有一种方法可以解决您的问题...

您将需要使用 Collections 并了解元素在列表中出现的频率...

示例:

public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("jack");
list.add("jack");
list.add("jack");
list.add("jack");
list.add("jack");
list.add("jim");
list.add("sara");
list.add("sara");
list.add("sara");
list.add("jim");
list.add("ricky");
list.add("ricky");
list.add("ricky");
list.add("angel");
Collections.sort(list);
for (String string : new LinkedHashSet<>(list)) {
    int firstIndex = list.indexOf(string);
    int frequency = Collections.frequency(list, string);
    System.out.println(string + " from: " + firstIndex + " to: " + (firstIndex + frequency - 1));
}
}

【讨论】:

  • 。如果不想要第一个排序,那么我需要在没有排序的情况下找到。如果你能帮助我,非常感谢。然后将所有 jim 名称附加到列表末尾。
【解决方案2】:

为了获取最后一个索引,您可以使用 HashMap,键作为名称,值作为索引。输入任何名称时,如果存在则更新其索引,否则输入该名称并将值作为其索引。

为了存储第一次出现使用另一个地图,并在其中存储该地图中不存在名称。

HashMap<String,Integer> firstOccur=new HashMap<String,Integer>();
HashMap<String,Integer> lastOccur=new HashMap<String,Integer>(); 

int index=0;
for(String myList:list){
   if(firstOccur.contains(myList)){
      lastOccur.delete(myList);
      lastOccur.add(myList,index);
   } else{
      firstOccur.add(myList,index);
      lastOccur.add(myList,index);
   }
  index++;
}

【讨论】:

    【解决方案3】:

    您可以使用Set,因为它不允许重复。

    代码:

    List<String> list = new ArrayList<String>();
    
    list.add("jack");
    list.add("jack");
    list.add("jack");
    list.add("jack");
    list.add("jack");
    list.add("jim");
    list.add("sara");
    list.add("sara");
    list.add("sara");
    list.add("jim");
    list.add("ricky");
    list.add("ricky");
    list.add("ricky");
    
    Set<String> set = new HashSet<String>();
    
    int j = 0;
    int k = 0; 
    int twoContinuousDifferentValue = 0;
    int size = list.size();
    
    for (int i = 0; i < size; i++) {
        String value = list.get(i);
        // set.add returns true if the element does not exists.
        if (set.add(value)) {
            twoContinuousDifferentValue++;
            if (i > 1 && twoContinuousDifferentValue == 1) {
                String currentListvalue = list.get(j);
                System.out.println(currentListvalue + " value starts from index " + j + " And up to index " + (i - k));
            }
            j = i; // storing last new index of second unique value.
        } else {
            twoContinuousDifferentValue = 0;
            if (i + 1 < size) {
                if (value.equalsIgnoreCase(list.get(i + 1))) {
                    k = 0;
                } else {
                    k += 1; // to count continuous unique values (example sara and jim, as jim was already addded to set, the value of i will increase by one and when ricky gets added the value of i will be 10, so we have to subtract it by 2 to get sara's index.
                  }
                }
                if (i == size - 1) {
                   System.out.println(value + " value starts from index " + j + " And up to index " + i);
    
                }
      }
    
    }
    

    输出:

    1. jack 值从索引 0 开始,一直到索引 4
    2. sara 值从索引 6 开始直到索引 8
    3. ricky 值从索引 10 开始,一直到索引 12

    注意:- 此代码适用于问题中给出的输入,如果您希望它适用于其他数组列表,则必须稍微调整逻辑。 我已经在代码中添加了 cmets,即使你不懂调试代码,因为逻辑很简单。

    您可以检查输出here

    【讨论】:

    • @Ravikumar 。我需要你的帮助。你能帮帮我吗?
    • @Rose 好的,有什么可以帮忙的吗?
    • 请进入聊天室。
    • 邀请我,我怎么能找到你?
    • 我不能和你说话。网站说我:您必须在 Stack Overflow 上拥有 20 名声望才能在这里交谈。请参阅常见问题解答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    相关资源
    最近更新 更多