Помогите с алгоритмом

155
04 января 2018, 23:03

Есть текстовый файл(txt) которую хочу перевести в xml с простой структурой.Только один тег.Трудности возникли при добавлении атрибута к тегу. Есть коллекция в ячейках которого есть числовые значения , они указывают скольким тегам нужно добавлять атрибут.А атрибуты я добавляю по нарастанию.Т.Е. напр. если int count [] = new int[]{5,3}; то первым пяти тегам нужно добавить атрибут attr=0 а следующим трем attr=1.В итоге должно быть как снизу на xml.

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <item attr="0">
            текст
    </item>
    <item attr="0">
            текст
    </item>
    <item attr="0">
            текст
    </item>
    <item attr="0">
            текст
    </item>
    <item attr="0">
            текст
    </item>
    <item attr="1">
            текст
    </item>
    <item attr="1">
            текст
    </item>
    <item attr="1">
            текст
    </item>
</root>

CODE:

StaticArrayStrings staticArrayStrings = new StaticArrayStrings();
staticArrayStrings.initList5();
File f = new File("text.txt");
InputStream inputStream = new FileInputStream(f);
InputStreamReader inputStreamReader = new 
InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
Element element=null;
int position=0;
int count=0;
int item=0;
String s;
while((s=bufferedReader.readLine())!=null){
    //получаю число,сколько раз нужно пробежаться.         
    item = Integer.valueOf(staticArrayStrings.list5.get(position).toString());
    element = new Element("item");
    element.attr("position",""+position);
    element.appendText(s);
    //вот тут нужна помощь.position нужно инкрементить после того 
    //как цикл пробежался item-й раз.Но если в ячейке  след.число 
    //меньше count то он уже не сработает.Помогите пожалуйста кто чем сможет.
    if(count==item){
          position++;
    }
    count++;
    System.out.println(element);
} System.out.println("общее число строк : "+count);

Класс в котором список значений :

public class StaticArrayStrings {
    public  List list5 = new ArrayList();
    void initList5(){
        list5.add(3);
        list5.add(2);
        list5.add(3);
        list5.add(2);
        list5.add(1);
        list5.add(165);
        list5.add(206);
        list5.add(75);
        list5.add(129);
        list5.add(109);
        list5.add(123);
        list5.add(111);
        list5.add(43);
        list5.add(52);
        list5.add(99);
        list5.add(128);
        list5.add(111);           
    }
}
Answer 1

Вам нужно завести еще счетчик, который будет указывать сколько элементов из текущей группы Вы израсходовали

Element element=null;
int position=0;
int count=0;
int curCnt=0;
// Получаем объем первой группы
int item = Integer.valueOf(staticArrayStrings.list5.get(position).toString());
while((s=bufferedReader.readLine())!=null){
    // Если исчерпали элементы из текущей группы, то 
    if (curCnt == item) {
      // сбрасываем счетчик,
      curCnt = 0;
      // увеличиваем номер группы
      position++;
      // считываем следующий объем
      item = Integer.valueOf(staticArrayStrings.list5.get(position).toString());
    }
    element = new Element("item");
    element.attr("position",""+position);
    element.appendText(s);
    count++;
    curCnt++;  // увеличиваем число использованных элементов
    System.out.println(element);
} System.out.println("общее число строк : "+count);

Вместо

curCnt++;  // увеличиваем число использованных элементов

можно писать

item--;

и тогда блок проверки условия перепишется так

// Если исчерпали элементы из текущей группы, то 
if (item == 0) {
  // увеличиваем номер группы
  position++;
  // считываем следующий объем
  item = Integer.valueOf(staticArrayStrings.list5.get(position).toString());
}

А еще лучше так, если в Вашем массиве допускаются нули

// Если исчерпали элементы из текущей группы, то 
while (item <= 0) {
  // увеличиваем номер группы
  position++;
  // считываем следующий объем
  item = Integer.valueOf(staticArrayStrings.list5.get(position).toString());
}

P.S. А почему Вы не пишете так?

public List<Integer> list5 = new ArrayList<>();

тогда вот эта порнография

item = Integer.valueOf(staticArrayStrings.list5.get(position).toString());

превратится в такой элегантный код

item = staticArrayStrings.list5.get(position);
READ ALSO
Java. Вероятность 5 процентов

Java. Вероятность 5 процентов

Подходит ли такой код для получения единицы с вероятностью 5 процентов?

189
не собирается пакет Maven [требует правки]

не собирается пакет Maven [требует правки]

При сборке пакета Maven выдает ошибку, не пойму , что не так

168
Расположение элементов java Swing

Расположение элементов java Swing

Почему расположение кнопок всегда посередине?

240
BubbleView, задать атрибуты программно

BubbleView, задать атрибуты программно

Для стилизации небольшого форума использую BubbleViewВ форуме почти все надо строить программно

209