Petla for powtorzenie

0

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.

0

To może jednak chodzi ci o pętlę while?

0

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.

0

Jak chcesz usuwać z listy po której iterujesz to musisz (!) jawnie używać iteratora i wywoływać na nim .remove()

1

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.

0

Ewentualnie do osobnej listy w pętli dodawać obiekty które spełniają wyrażenie i na końcu listaBazowa.removeAll(lista).

0

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.

0

Czy może dostałeś takie zadanie do wykonania na teście kwalifikacyjnym do pracy?

0

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 :)

0

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);
	}
}
0

@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

0

@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...

0

@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ę.

0
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1