Здравствуйте, постоянно сталкиваюсь с проблемой сравнения объектов или просто переменных, даже одного типа. Точнее, элементов разных массивов одного типа.
Конкретика:
Нужно занести в один массив индексы всех элементов другого массива,
которые *не* содержатся в третьем массиве.
Реализую я это следующим образом:
...
// Array_1 - одномерный int массив с некоторыми элементами
// Array_2 - одномерный List<Integer>, в котором хранятся
// индексы элементов, которые переносить не надо
...
List<Integer> Array_3 = new ArrayList<>();
for (Integer i = 0; i < Array_1.length; i++){
for (int j = 0; j < Array_2.size(); j++){
if (!Array_2.get(j).equals(i)){
Array_3.add(i);
}
}
}
В чём проблема: проверка !Array_2.get(j).equals(i)
не срабатывает, и не важно, стоит восклицательный знак или нет - условие будет всегда true, и заноситься будут все i, а не те, которых нет в Array_2
.
И так не в первый раз. Такое замечаю постоянно - проверяю правильно, через .equals()
, а результат нулёвый. Типы данных тоже соблюдаю - раз в Array_2
у меня хранятся объекты Integer
, то и i тоже типа Integer
.
И вторая часть вопроса:
У меня есть некоторая функция, которая транспонирует двумерный List<List<Integer>>
. В отдельном проекте всё работает отлично: в нём я создал конкретный вариант этого двумерного List
-a, вывел его на экран, транспонировал, вывел на экран, попробовал разные варианты и размеры - все работает. В этом проекте больше ничего нет. В том же, где я пишу, если я пытаюсь вызвать эту функцию, программа зацикливается. Причём не зависает, что Windows пишет "программа не отвечает", а работает, но зациклившись и не закрываясь.
Вот, собственно, код:
public static List<List<Integer>> transpose_2list (List<List<Integer>> badList) {
// создаём "дупликат" поданного List-a, т.к. из него самого
// нельзя ничего удалять, добавлять etc.
List<List<Integer>> answer = new ArrayList<>();
Integer strings = 0, columns = 0;
if (badList.size() < 1) {
answer = badList;
}
// без этой проверки, если входной List будет пустым, будет NullPointerException
if (badList.size() > 0) {
if (badList.get(0).size() > 0) {
strings = badList.get(0).size();
}
}
if (badList.size() > 0) {
columns = badList.size();
}
for (Integer i = 0; i < strings; i++) {
answer.add(new ArrayList<>(columns));
}
// само транспонирование
for (int i = 0; i < strings; i++) {
for (int j = 0; j < columns; j++) {
answer.get(i).add(badList.get(j).get(i));
}
}
return answer;
}
Код рабочий, вроде, всё нормально. Вычислил, как выглядит подающийся в эту функцию List, специально попробовал всё в отдельном файле - проблем нет. При вызове в сложной программе - зацикливание. Причём именно на этой функции. Причём, после череды проб, мне показалось, что это как раз из-за проверок на badList.size()
и т.д. Но без этого программа может крашнуться, и так далее. Пробовал сделать следующим образом:
public static List<List<Integer>> transpone_the_2list (List<List<Integer>> badList) {
List<List<Integer>> answer = new ArrayList<>();
Integer strings = 0, columns = 0;
boolean transposed = false;
if (badList.size() < 1) {
answer = badList;
}
// добавил всего одну проверку
if (!transposed){
transposed = true;
if (badList.size() > 0) {
if (badList.get(0).size() > 0) {
strings = badList.get(0).size();
}
}
if (badList.size() > 0) {
columns = badList.size();
}
for (Integer i = 0; i < strings; i++) {
answer.add(new ArrayList<>(columns));
}
for (int i = 0; i < strings; i++) {
for (int j = 0; j < columns; j++) {
answer.get(i).add(badList.get(j).get(i));
}
}
}
return answer;
}
Эта проверка тоже игнорируется и программа зацикливается,
даже больше: Intellij IDEA
говорит:
Я примерно понимаю, что, по идее, при прохождении условия оно всегда true, и что это не цикл, но почему тогда программа зависает? Уже паранойя нападает, и начинаешь тыкать сотни непонятных ненужных проверок :) Что я делаю не так? Извините, если много текста, я решил подробно и на примерах описать свои проблемы. Благодарю заранее :)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Я сделал NavigationDrawer с помощью MaterialDrawer от Mike PenzОн отлично работает, но когда я пытаюсь заменить значки "FontAwesome" на "GoogleMaterial" или другие получаю...
мне нужно прочтитать именно fbx binary(не предлагать fbx ascii)(хотел написать конвертер именно для java)