Witam.
Pisze prosty program i nie zaglębiając sie w szczegóły mam problem z petlą for.
Moim zadaniem jest spełnic okreslone warunki i wykonać działanie w tym przypadku usunąć obiekt z Listy<object>
chciałbym by petla po wykonaniu tego zadania rozpoczęła sie od nowa na tych samych zasadach. I tak za kazdym razem jeżeli bedzie możliwość spełnienia instrukcji warunkowej podanej przeze mnie.
To może jednak chodzi ci o pętlę while?
Być może ale moja głupota nie pozwala mi na pewność. Zamieszczę fragment kodu. Jest to dodwanie zbiorów liczbowych, zadanie z nieudanego testu kwalifikacyjnego.
Klasa punkt ;
public class Punkt implements Comparable<Punkt>{
int begin;
int end;
Klasa Main
List<Punkt> zbiory= new ArrayList<Punkt>();
// sortowanie i dodwanie obiektow do Listy pominę;
for(int i=0;i<zbiory.size()-1;i++){
if(zbiory.get(i+1).begin<=zbiory.get(i).end && zbiory.get(i).end <= zbiory.get(i+1).end){
zbiory.get(i).end=zbiory.get(i+1).end;
zbiory.remove(i+1);
System.out.println(zbiory);
}
if(zbiory.get(i+1).begin<=zbiory.get(i).end && zbiory.get(i).end >= zbiory.get(i+1).end){
zbiory.remove(i+1);
System.out.println(zbiory);
Chcialbym by po wykonaniu instukcji if() petla rozpoczęła się od nowa z uwzglednieniem zmiany wielkości listy.
Przepraszam za chaos i pytania na poziomie 0.
Jak chcesz usuwać z listy po której iterujesz to musisz (!) jawnie używać iteratora i wywoływać na nim .remove()
http://stackoverflow.com/a/223927 tutaj masz usuwanie podczas iteracji.
import java.util.*;
public class Main {
public static void main(String[] args) {
List<Integer> one = Arrays.asList(1,2,3);
List<Integer> two = Arrays.asList(3,4,5);
Set<Integer> sum = new TreeSet<Integer>();
sum.addAll(one);
sum.addAll(two);
System.out.println(sum);
}
}
a tutaj suma zbiorów.
Ewentualnie do osobnej listy w pętli dodawać obiekty które spełniają wyrażenie i na końcu listaBazowa.removeAll(lista).
Karolina chodzi mi o przedziały liczbowe. Jedno słowo dużo zmienilo :)
czyli np:
(1,2) + <2,4) + (5,7)= (1,4) + (5,7 ) uzyłem + zamiast symbolów logicznych
Co do itereatora to wieczorem poczytam i zmienie kod i zobaczę co z tego wyjdzie.
Czy może dostałeś takie zadanie do wykonania na teście kwalifikacyjnym do pracy?
Atlas500 tak, jeżeli jesteś na tym samym etapie w zyciu pisz priv wymienimy doświadczenia(co trzeba wiedzieć, przykładowe zadania itd).
Widzę po Twoich postach, że aplikowałeś w tej samej firmie co ja tylko w innym oddziale :)
ostatnio oglądałam wyrywkowo i wleciał mi w ucho ten fragment
import com.google.common.collect.Range;
import com.google.common.collect.RangeSet;
import com.google.common.collect.TreeRangeSet;
public class Main {
public static void main(String[] args) {
RangeSet<Integer> rangeSet = TreeRangeSet.create();
rangeSet.add(Range.open(1,2));
rangeSet.add(Range.closedOpen(2,4));
rangeSet.add(Range.open(5,7));
System.out.println(rangeSet);
}
}
@kompleks Dopiero mnie przyjęli do pracy, jeszcze nie mam żadnych doświadczeń :) Ja też nie wiedziałem wcześniej jak usuwać elementy z iterowanej kolekcji i zrobiłem to tak:
public class Test{
public static void main(String... a){
ArrayList<Range> l = new ArrayList<>();
l.add(new Range(5, 8));
l.add(new Range(-3, 2));
l.add(new Range(13, 15));
l.add(new Range(5, 12));
l.add(new Range(6, 7));
ArrayList<Range> list = addSets(l);
for(Range r : list){
System.out.println("<" + r.begin + ", " + r.end + ">");
}
}
public static ArrayList<Range> addSets(ArrayList<Range> al){
ArrayList<Range> tmpList = new ArrayList<>();
ArrayList<Range> toRemove = new ArrayList<>();
for(Range pAl : al){
for(Range tmp : tmpList){
if(tmp.begin >= pAl.begin && tmp.begin <= pAl.end ||
tmp.end >= pAl.begin && tmp.end <= pAl.end){
if(tmp.end > pAl.end) pAl.end = tmp.end;
if(pAl.begin > tmp.begin) pAl.begin = tmp.begin;
toRemove.add(tmp);
}else if(tmp.begin < pAl.begin && tmp.end > pAl.end){
pAl.begin = tmp.begin;
pAl.end = tmp.end;
toRemove.add(tmp);
}
}
tmpList.add(pAl);
if(!toRemove.isEmpty()){
tmpList.removeAll(toRemove);
toRemove.clear();
}
}
return tmpList;
}
}
class Range{
int begin;
int end;
public Range(int b, int e){
begin = b;
end = e;
}
}
Swoją drogą dosyć rozległe było to zadanie jak na 10-15 min pod presją, do napisania na 4/5 kartki a4 długopisem (mogli dać chociaż ołówek z gumką). Senior podczas odcyfrowywania mojego kodu mamrotał pod nosem coś jakby: "hbm..usimy tu dhać kompa" :D
@Atlas500 nie że krytykuje to ten kod to turbo WTF. Raz że mam wrażenie ze da się to zrobić w O(n) z jedną pętlą jeśli najpierw posortujesz sobie range po pierwszej współrzędnej a dwa ze ta twoja wewnętrzna pętla ma level nieczytelności over 9000. Zmiast takich okropnych warunków powinieneś zrobić funkcje z ladnymi nazwami...
@Shalom wszystko prawda, zostało to zrobione dziadowsko, ale działa, a to było głównym celem, bo warunki były bojowe. Powinieneś zobaczyć jak to wyglądało napisane na kartce :D
Dzięki za uwagi, poeksperymentuję.
class Range(object):
def __init__(self, begin, end):
self.begin=begin
self.end=end
def __repr__(self):
return "(%d,%d)" %(self.begin, self.end)
def merge_adiacent(ranges, start):
first = ranges[start]
second = ranges[start+1]
if first.end >= second.begin:
ranges[start]=Range(first.begin, first.end if first.end > second.end else second.end)
ranges.pop(start+1)
return True
return False
def compress(ranges_list):
sorted_ranges = sorted(ranges_list, cmp=lambda range1, range2: cmp(range1.begin, range2.begin))
current = 0
for i in range(len(sorted_ranges)-1):
if not merge_adiacent(sorted_ranges, current):
current+=1
return sorted_ranges
def main():
ranges = [Range(5, 8), Range(-3, 2), Range(13, 15), Range(5, 12), Range(6, 7)]
print(compress(ranges))
main()
http://ideone.com/CH8D3z
W javie nie byłoby to dużo dłuższe.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.