Java Float становится 0.0 после добавления в ArrayList <T> - PullRequest
0 голосов
/ 26 января 2010

У меня есть следующий объект:

class Repeat{
    private long startIndex;
    private long endIndex;
    private int length;
    private float repetitions;
    private float period;
    private int errors;
    private float percentOverlap;

    public void setPercentOverlap(float percentOverlap) {
       this.percentOverlap = percentOverlap;
    }

    public float getPercentOverlap() {
       return percentOverlap;
    }
    .
    . other sets gets etc.
    .
}

Когда я устанавливаю percentOverlap и добавляю Повторить к

ArrayList<Repeat> overlaps = new ArrayList<Repeat>(); 
overlaps.add(repeat);

Тогда, когда я дам эту коллекцию в CSV-файл. Я получаю 0.0 для некоторых значений, но не для всех. то есть. 6,25 становится 0,0. Я даже вижу это в командной строке.

Вот вывод консоли:

-> прежде чем я добавлю
-> Начальный индекс: 570433 Конечный индекс: 570465 Перекрытие: 100,0
-> Начальный индекс: 570433 Конечный индекс: 570465 Перекрытие: 6,25
-> Начальный индекс: 570433 Конечный индекс: 570465 Перекрытие: 0,0
-> Начальный индекс: 570470 Конечный индекс: 570510 Перекрытие: 85,0
-> Начальный индекс: 570470 Конечный индекс: 570510 Перекрытие: 100,0

Когда я повторяю коллекцию, вот что получается.

Начальный индекс: 570433 Конечный индекс: 570465 Перекрытие: 0,0
Начальный индекс: 570433 Конечный индекс: 570465 Перекрытие: 0.0
Начальный индекс: 570433 Конечный индекс: 570465 Перекрытие: 0,0
Начальный индекс: 570470 Конечный индекс: 570510 Перекрытие: 100,0
Начальный индекс: 570470 Конечный индекс: 570510 Перекрытие: 100,0

Я вынул запись файла, просто печатая на консоль.

Почему это происходит?

Ответы [ 4 ]

3 голосов
/ 26 января 2010

Каждый говорит вам правильный ответ: вы добавляете один и тот же объект в коллекцию более одного раза.

Ваш внешний цикл делает новый повтор повторения1. Ваш внутренний цикл устанавливает значения в этом объекте и добавляет его в коллекцию один раз на каждой итерации.

Даже если вы устанавливаете разные значения в repeat1 для каждой внутренней итерации, это все тот же объект.

Вот почему вы получаете результаты, которые вы показываете. Ваша коллекция выглядит примерно так:

1: первый повтор 1 2: первое повторение1 3: первое повторение1 4: Второе повторение1 5: Второе повторение 1

и т.д.

1 голос
/ 26 января 2010

Похоже, что начальный и конечный индексы приведенных ниже записей совпадают.

->Start Index: 570433 End Index: 570465 Overlap :100.0
->Start Index: 570433 End Index: 570465 Overlap :6.25
->Start Index: 570433 End Index: 570465 Overlap :0.0

->Start Index: 570470 End Index: 570510 Overlap :85.0
->Start Index: 570470 End Index: 570510 Overlap :100.0 

.

Затем при выводе значение перекрытия (0,0, 100,0) повторяется для одного и того же индекса начала и конца индекса. Это означает, что один и тот же объект повторно используется для заданного начального индекса и конечного индекса. Следовательно, значения всех предыдущих объектов Repeat повторяются. С новым индексом начала и конца индекса создается новый объект Repeat.

Проверьте логику кода, в котором создается экземпляр объекта Repeat.

1 голос
/ 26 января 2010

Исходя из полученного вывода, можно предположить, что вы добавляли один и тот же объект в ArrayList несколько раз, когда вам нужно было добавить новый экземпляр.Показанный код выглядит нормально, поэтому ошибка в другом месте.

0 голосов
/ 26 января 2010
for(Repeat repeat1 : collection1){

                // length of repeat from first collection input
                long length1 = repeat1.getEndIndex() - repeat1.getStartIndex();

                float percentOverlap;
                long overlapamount = 0;

                // For each repeat in collection2
                HERE:for(Repeat repeat2 : collection2){


                    // length of repeat from second collection input
                    long length2 = repeat2.getEndIndex() - repeat2.getStartIndex();

                    // if this condition fails, no reason to iterate any further.
                    // This is the feature that c# lacks. It saves quite a processing time. 
                    if (repeat1.getStartIndex() > repeat2.getEndIndex() || repeat1.getEndIndex() < repeat2.getStartIndex())
                    {
                         continue HERE;
                    }

                    if (repeat1.getStartIndex() <= repeat2.getStartIndex() && repeat2.getStartIndex() <= repeat1.getEndIndex())
                    {
                        // if repeat1 start index is less than or equal to repeat 2 start index
                        // and if repeat2 start index is less than or equal to repeat1 end index.
                        // 1,3 - 2,4
                        overlapamount = repeat1.getEndIndex() - repeat2.getStartIndex();
                    }
                    else if (repeat2.getStartIndex() <= repeat1.getStartIndex() && repeat1.getEndIndex() <= repeat2.getEndIndex())
                    {
                        // if repeat 2 start index is less than or equal to repeat 1 start index
                        // and if repeat 1 end index is less than or equal to repeat 2 end index
                        // 2,3 - 1,4
                        overlapamount = repeat1.getEndIndex() - repeat1.getStartIndex();
                    }
                    else if (repeat2.getStartIndex() <= repeat1.getStartIndex() && repeat2.getEndIndex() <= repeat1.getEndIndex())
                    {
                        // if repeat 2 start index is less than or equal to repeat1 start index
                        // and repeat 2 end index is less than or equal to repeat 1 end index
                        //
                        // 2,4 - 1,3
                        overlapamount = repeat2.getEndIndex() - repeat1.getStartIndex();
                    }
                    else if (repeat1.getStartIndex() <= repeat2.getStartIndex() && repeat2.getEndIndex() <= repeat1.getEndIndex())
                    {
                        // repeat 1 start index is less than or equal to repeat 2 start index
                        // and repeat 2 end index is less than or equal to repeat 1 end index
                        // 
                        // 1,4 - 2,3
                        overlapamount = repeat2.getEndIndex() - repeat2.getStartIndex();
                    } 

                    // Finds the overlapping percentage
                    percentOverlap = (float) (Math.max((float)((float)overlapamount /(float)length1), (float)((float)overlapamount /(float)length2)) * 100);
                    System.out.println(percentOverlap);
                    repeat1.setPercentOverlap(percentOverlap);

                    // Populates collection by percentage
                    overlaps.add(repeat1);
                    System.out.println("->"+repeat1.toString());
                }

            }

         for(Repeat x : overlaps){
                System.out.println(x.toString());
         }

    }

Вот код. Вот как данные. Это связано со сравнением алгоритмов сканирования ДНК между двумя подходами и обнаружением перекрытия и т. Д.

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