Существует ли способ получить доступ к итеративному счетчику в цикле foreach Java?

Вы можете прочитать файл .csv с помощью потокового считывателя и разделить столбцы с помощью функции split (";"), определяя точку с запятой как разделитель каждой строки. После этого вы можете сохранять данные в arrayList или в таблицу базы данных в соответствии со столбцом.

List<string> lattitude=new List<string>();
List<string> longitude=new List<string>();
List<string> timestamp=new List<string();
using (var rd = new StreamReader("yourfile.csv"))
{
    while (!rd.EndOfStream)
    {
        var arrlst= rd.ReadLine().Split(';');
        timestamp.add(arrlst[0])
        lattitude.Add(arrlst[1]);
        longitude.Add(arrlst[2]);
    }
}

Теперь вы можете использовать Timepicker для подсчета секунд, используя счетчик для отслеживания каждые 13 секунд. [Вы можете получить интервал секунд, получая разницу смежных времен от отметки времени] всякий раз, когда счетчик считает до 13, то снова запустите счетчик с 0. Вы будете выполнять вышеуказанные шаги, пока все данные в нужном списке не будут прочитаны. когда все данные прочитаны, вы можете остановить таймер, вызывая логику. Это способ получения данных из необходимого списка по одному в соответствии со значением метки времени и в соответствии с вашими потребностями.

Тема: создайте несколько тем с помощью новой темы (). запускайте потоки, основываясь на ваших интервалах.

Надеюсь, это поможет. Благодаря

257
задан trapzerapzerix 27 January 2017 в 02:28
поделиться

7 ответов

Нет, но можно предоставить собственный счетчик.

причина этого состоит в том, что цикл foreach внутренне не делает , имеют счетчик; это основано интерфейс Iterable , т.е. это использует Iterator для цикличного выполнения через "набор" - который не может быть набором вообще и не может на самом деле быть чем-то нисколько на основе индексов (таких как связанный список).

187
ответ дан ragerdl 23 November 2019 в 02:43
поделиться

Я боюсь, что это не возможно с foreach. Но я могу предложить Вас простое старо разработанный для циклов :

    List<String> l = new ArrayList<String>();

    l.add("a");
    l.add("b");
    l.add("c");
    l.add("d");

    // the array
    String[] array = new String[l.size()];

    for(ListIterator<String> it =l.listIterator(); it.hasNext() ;)
    {
        array[it.nextIndex()] = it.next();
    }

Уведомление, что, интерфейс List предоставляет Вам доступ к it.nextIndex().

(редактирование)

К Вашему измененному примеру:

    for(ListIterator<String> it =l.listIterator(); it.hasNext() ;)
    {
        int i = it.nextIndex();
        doSomethingWith(it.next(), i);
    }
16
ответ дан bruno conde 23 November 2019 в 02:43
поделиться

Одно из изменений Sun рассматривает для Java7, должен обеспечить доступ к внутреннему Iterator в циклах foreach. синтаксис будет чем-то вроде этого (если это будет принято):

for (String str : list : it) {
  if (str.length() > 100) {
    it.remove();
  }
}

Это - синтаксический сахар, но по-видимому много запросов было выполнено для этой функции. Но пока это не утверждено, необходимо будет считать повторения сами или использовать постоянного клиента для цикла с Iterator.

9
ответ дан Mamun 23 November 2019 в 02:43
поделиться

При необходимости в счетчике в цикле foreach, необходимо считать себя. Существует не создан в счетчике насколько я знаю.

2
ответ дан John Topley 23 November 2019 в 02:43
поделиться

Самое легкое решение состоит в том, чтобы просто запустить Ваш собственный счетчик таким образом:

int i = 0;
for (String s : stringArray) {
    doSomethingWith(s, i);
    i++;
}

Причина этого состоит в том, потому что нет никакой фактической гарантии что объекты в наборе (который тот вариант for выполняет итерации), даже имеют индекс или даже имеют определенный порядок (некоторые наборы могут изменить порядок, когда Вы добавляете или удаляете элементы).

Посмотрите, например, следующий код:

import java.util.*;

public class TestApp {
  public static void AddAndDump(AbstractSet<String> set, String str) {
    System.out.println("Adding [" + str + "]");
    set.add(str);
    int i = 0;
    for(String s : set) {
        System.out.println("   " + i + ": " + s);
        i++;
    }
  }

  public static void main(String[] args) {
    AbstractSet<String> coll = new HashSet<String>();
    AddAndDump(coll, "Hello");
    AddAndDump(coll, "My");
    AddAndDump(coll, "Name");
    AddAndDump(coll, "Is");
    AddAndDump(coll, "Pax");
  }
}

При выполнении этого Вы видите что-то как:

Adding [Hello]
   0: Hello
Adding [My]
   0: Hello
   1: My
Adding [Name]
   0: Hello
   1: My
   2: Name
Adding [Is]
   0: Hello
   1: Is
   2: My
   3: Name
Adding [Pax]
   0: Hello
   1: Pax
   2: Is
   3: My
   4: Name

указание, что, справедливо так, порядок не считают существенной функцией набора.

Существуют другие способы сделать это без ручного счетчика, но это - маленькая работа для сомнительного преимущества.

44
ответ дан paxdiablo 23 November 2019 в 02:43
поделиться

Есть другой способ.

Учитывая, что вы пишете свой собственный класс Index и статический метод, который возвращает Iterable по экземплярам этого class вы можете

for (Index<String> each: With.index(stringArray)) {
    each.value;
    each.index;
    ...
}

Где реализация With.index выглядит примерно как

class With {
    public static <T> Iterable<Index<T>> index(final T[] array) {
        return new Iterable<Index<T>>() {
            public Iterator<Index<T>> iterator() {
                return new Iterator<Index<T>>() {
                    index = 0;
                    public boolean hasNext() { return index < array.size }
                    public Index<T> next() { return new Index(array[index], index++); }
                    ...
                }
            }
        }
    }
}
61
ответ дан 23 November 2019 в 02:43
поделиться

Есть "вариант" ответа pax ...; -)

int i = -1;
for(String s : stringArray) {
    doSomethingWith(s, ++i);
}
1
ответ дан 23 November 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: