mac->arch

This commit is contained in:
eslusarz
2026-05-19 13:42:21 +02:00
parent 646f4dc077
commit 30b66dd99b
305 changed files with 1617 additions and 31630 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+36
View File
@@ -0,0 +1,36 @@
package network;
import java.util.Iterator;
import java.util.Set;
public interface Graph<Vertex, Wheight> extends Iterable<Vertex> {
public boolean containsVertex(Vertex vertex);
public boolean addVertex(Vertex vertex);
public boolean removeVertex(Vertex vertex);
public int edgeSize();
public Wheight getEdgeWheight(Vertex v1, Vertex v2);
public boolean containsEdge(Vertex v1, Vertex v2);
public boolean addEdge(Vertex v1, Vertex v2, Double weight);
public boolean removeEdge(Vertex v1, Vertex v2);
public boolean isEmpty();
public int size();
public Set<Vertex> neighbors (Vertex v);
public Iterator<Vertex> iterator();
public Iterator<Vertex> breadthFirstIterator(Vertex v);
public Iterator<Vertex> depthFisrtIterator (Vertex v);
}
+47
View File
@@ -0,0 +1,47 @@
package network;
import java.util.Iterator;
import java.util.Set;
public interface UnweightGraph<Vertex> extends Iterable<Vertex> {
// FATTO
public boolean containsVertex(Vertex vertex);
// FATTO
public boolean addVertex(Vertex vertex);
// FATTO
public boolean removeVertex(Vertex vertex);
// FATTO
public int edgeSize();
// FATTO
public boolean containsEdge(Vertex v1, Vertex v2);
// FATTO
public boolean addEdge(Vertex v1, Vertex v2);
// FATTO
public boolean removeEdge(Vertex v1, Vertex v2);
// FATTO
public boolean isEmpty();
// FATTO
public int size();
// FATTO
public Set<Vertex> neighbors (Vertex v);
// FATTO
public Iterator<Vertex> iterator();
// FATTO
public Iterator<Vertex> breadthFirstIterator (Vertex v);
public Iterator<Vertex> depthFisrtIterator (Vertex v);
}
+311
View File
@@ -0,0 +1,311 @@
package network.network;
import network.Graph;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.Stack;
import java.util.TreeMap;
import java.util.TreeSet;
public class Network<Vertex extends Comparable<? super Vertex>> implements Graph<Vertex, Double>{
protected TreeMap<Vertex, TreeMap<Vertex, Double>> adjacencyMap;
public Network() {
this.adjacencyMap = new TreeMap<Vertex, TreeMap<Vertex, Double>>();
}
public Network(Network<Vertex> network) {
this.adjacencyMap = new TreeMap<Vertex, TreeMap<Vertex, Double>>(network.adjacencyMap);
}
@Override
public boolean equals(Object object) {
if (object == null) return false;
if (object == this) return true;
if (!(object instanceof Network)) return false;
Network<?> network = (Network<?>) object;
return adjacencyMap.equals(network.adjacencyMap);
}
@Override
public boolean containsVertex(Vertex vertex) {
return adjacencyMap.containsKey(vertex);
}
@Override
public boolean addVertex(Vertex vertex) {
// Null Check
if (vertex == null) throw new NullPointerException();
// Se l'elemento è già presente
if (containsVertex(vertex)) return false;
// Inserimento
adjacencyMap.put(vertex, new TreeMap<Vertex, Double>());
return true;
}
@Override
public boolean removeVertex(Vertex vertex) {
// Null check
if (vertex == null) throw new NullPointerException();
// Se l'elemento non è presente
if (!containsVertex(vertex)) return false;
// Rimozione del vertice dalle liste di adiacenza
for (Vertex v : adjacencyMap.keySet()) {
adjacencyMap.get(v).remove(vertex);
}
// Rimozione del vertice dalle chiavi
adjacencyMap.remove(vertex);
return true;
}
/*
* Restituisce il numero di archi presenti all'interno del grafo
*/
@Override
public int edgeSize() {
// Variabile contatore
int edges = 0;
// Conto degli archi
for (Vertex v : adjacencyMap.keySet()) {
edges += adjacencyMap.get(v).size();
}
return edges;
}
@Override
public Double getEdgeWheight(Vertex v1, Vertex v2) {
// Null check
if (v1 == null || v2 == null) throw new NullPointerException();
// Verifichiamo se ambedue sono presenti nel grafo, se non ci sono allora return null.
if (!(containsVertex(v1) && containsVertex(v2))) return null;
// Otteniamo la lista di adiacenza
Map<Vertex, Double> tmp = adjacencyMap.get(v1);
// Se il vertex2 non presenta il vertice2 allora non esiste il peso
if (!tmp.containsKey(v2)) return null;
return tmp.get(v2);
}
@Override
public boolean containsEdge(Vertex v1, Vertex v2) {
// Null check
if (v1 == null || v2 == null) throw new NullPointerException();
// Verifichiamo che ambedue siano nel grafico
if (!(containsVertex(v1) && containsVertex(v2))) return false;
// Otteniamo la lista di adiacenza
Map<Vertex, Double> tmp = adjacencyMap.get(v1);
return tmp.containsKey(v2);
}
@Override
public boolean addEdge(Vertex v1, Vertex v2, Double weight) {
// Null check
if (v1 == null || v2 == null || weight == null) throw new NullPointerException();
// Verifichiamo che ambedue siano nel grafico
if (!(containsVertex(v1) && containsVertex(v2))) return false;
// Verifichiamo che non esista l'arco. Se esiste allora non fa nulla. Se non esiste lo aggiunge.
if (containsEdge(v1, v2)) return false;
// Aggiunta dell'edge
Map<Vertex, Double> tmp = adjacencyMap.get(v1);
tmp.put(v2, weight);
return true;
}
@Override
public boolean removeEdge(Vertex v1, Vertex v2) {
// Null check
if (v1 == null || v2 == null) throw new NullPointerException();
// Verifichiamo che ambedue siano nel grafico
if (!(containsVertex(v1) && containsVertex(v2))) return false;
// Verifichiamo se l'arco esiste oppure no.
if (!containsEdge(v1, v2)) return false;
// Rimozione dell'edge
Map<Vertex, Double> tmp = adjacencyMap.get(v1);
tmp.remove(v2);
return true;
}
@Override
public boolean isEmpty() {
return adjacencyMap.isEmpty();
}
@Override
public int size() {
return adjacencyMap.keySet().size();
}
@Override
public Set<Vertex> neighbors(Vertex v) {
// Null check
if (v == null) throw new NullPointerException();
// Presenza del vertice nel grafo
if (!containsVertex(v)) return null;
// Se il vertice è presente, allora restituisco il tutto
return new TreeSet<Vertex>(adjacencyMap.get(v).keySet());
}
@Override
public Iterator<Vertex> iterator() {
return new NetworkIterator();
}
protected class NetworkIterator implements Iterator<Vertex> {
// Variabili
protected Iterator<Vertex> iterator;
protected Vertex currentVertex;
// Costruttore
public NetworkIterator() {
this.iterator = adjacencyMap.keySet().iterator();
}
// hasNext
public boolean hasNext() {
return this.iterator.hasNext();
}
// next
public Vertex next() {
this.currentVertex = iterator.next();
return this.currentVertex;
}
// remove
public void remove() {
throw new UnsupportedOperationException();
}
}
@Override
public Iterator<Vertex> breadthFirstIterator(Vertex vertex) {
if (!this.adjacencyMap.containsKey(vertex)) throw new IllegalArgumentException();
return new BreadthFirstIterator(vertex);
}
protected class BreadthFirstIterator implements Iterator<Vertex> {
// Variabili
protected Queue<Vertex> queue;
protected HashMap<Vertex, Boolean> research;
protected Vertex currentVertex;
// Costruttore
public BreadthFirstIterator(Vertex vertex) {
this.queue = new LinkedList<Vertex>();
this.research = new HashMap<Vertex, Boolean>();
for (Vertex v : adjacencyMap.keySet()) {
research.put(v, false);
}
queue.add(vertex);
research.put(vertex, true);
}
public boolean hasNext() {
return !(queue.isEmpty());
}
public Vertex next() {
currentVertex = queue.remove();
Set<Vertex> neighborsSet = adjacencyMap.get(currentVertex).keySet();
for (Vertex v : neighborsSet) {
if (research.get(v)) continue;
research.put(v, true);
queue.add(v);
}
return currentVertex;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
@Override
public Iterator<Vertex> depthFisrtIterator(Vertex v) {
return new DepthFirstIterator(v);
}
protected class DepthFirstIterator implements Iterator<Vertex>{
// Variabili
protected Stack<Vertex> stack = new Stack<Vertex>();
protected HashMap<Vertex, Boolean> reached;
Vertex current;
// Costruttore
public DepthFirstIterator(Vertex vertex) {
this.stack = new Stack<Vertex>();
this.reached = new HashMap<Vertex, Boolean>();
for (Vertex v : adjacencyMap.keySet()) {
this.reached.put(v, false);
}
this.stack.add(vertex);
this.reached.put(vertex, true);
}
public boolean hasNext() {
return !stack.isEmpty();
}
public Vertex next() {
this.current = this.stack.pop();
Set<Vertex> neighborsSet = adjacencyMap.get(this.current).keySet();
for (Vertex v : neighborsSet) {
if (this.reached.get(v)) {
if (this.stack.remove(v)) stack.add(v);
} else {
this.stack.add(v);
this.reached.put(v, true);
}
}
return current;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
// ESERCIZI
/*
* Un grafo è detto fortementeConnesso quando per ogni vertice
* si può raggiungere un qualsiasi altro vertice del grafo
*/
public boolean isStronglyConnected() {
for (Vertex SS : adjacencyMap.keySet()) {
Iterator<Vertex> it = this.breadthFirstIterator(SS);
int counter = 0;
while (it.hasNext()) {
counter++;
it.next();
}
if (counter < adjacencyMap.size()) return false;
}
return true;
}
}
@@ -0,0 +1,277 @@
package network.network;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
import java.util.Stack;
import network.UnweightGraph;
public class UnweightNetwork<Vertex> implements UnweightGraph<Vertex> {
// Lista di adiacenza
private HashMap<Vertex, HashSet<Vertex>> adjacencyMap;
// Costruttore
public UnweightNetwork() {
adjacencyMap = new HashMap<Vertex, HashSet<Vertex>>();
}
public UnweightNetwork(UnweightNetwork<Vertex> network) {
adjacencyMap = new HashMap<Vertex, HashSet<Vertex>>(network.adjacencyMap);
}
@Override
public boolean equals(Object object) {
if (object == null) return false;
if (object == this) return true;
if (!(object instanceof UnweightNetwork<?>)) return false;
UnweightNetwork<?> unweightNetwork = (UnweightNetwork<?>) object;
return this.adjacencyMap.equals(unweightNetwork.adjacencyMap);
}
@Override
public boolean isEmpty() {
return this.adjacencyMap.isEmpty();
}
@Override
public int size() {
return this.adjacencyMap.size();
}
@Override
public int edgeSize() {
int counter = 0;
for (Vertex v : adjacencyMap.keySet()) {
HashSet<Vertex> neighbours = adjacencyMap.get(v);
counter += neighbours.size();
}
return counter;
}
@Override
public boolean containsVertex(Vertex vertex) {
return adjacencyMap.containsKey(vertex);
}
@Override
public boolean addVertex(Vertex vertex) {
// Null check
if (vertex == null) throw new NullPointerException();
// Controllo la presenza di un vertice già presente all'interno del grafo
if (containsVertex(vertex)) return false;
// Aggiunta di un vertice e della sua lista di adiacenza
HashSet<Vertex> vertexAdjacencyMap = new HashSet<Vertex>();
adjacencyMap.put(vertex, vertexAdjacencyMap);
return true;
}
@Override
public boolean removeVertex(Vertex vertex) {
// Null check
if (vertex == null) throw new NullPointerException();
// Controllo la presenza di un vertice già presente
if (!(containsVertex(vertex))) return false;
// Rimozione del vertice stesso
adjacencyMap.remove(vertex);
// Rimozione del vertice in altre liste di adiacenza
for (Vertex v : adjacencyMap.keySet()) {
HashSet<Vertex> neighboorsAdjacencyMap = adjacencyMap.get(v);
neighboorsAdjacencyMap.remove(vertex);
}
return true;
}
@Override
public boolean containsEdge(Vertex v1, Vertex v2) {
// Null check
if (v1 == null || v2 == null) throw new NullPointerException();
// Contorllo la presenza dei vertici che siano già esistenti.
if (!((containsVertex(v1)) && (containsVertex(v2)))) return false;
// Data la presenza dei due vertici continua pure il tutto.
// Acquisiamo la lista di adiacenza del vertice 1
HashSet<Vertex> neighboorsAdjacencyMap = adjacencyMap.get(v1);
// Controlliamo che sia presente v2 nella lista di adiacenza di V1
return neighboorsAdjacencyMap.contains(v2);
}
@Override
public boolean removeEdge(Vertex v1, Vertex v2) {
// Null check
if (v1 == null || v2 == null) throw new NullPointerException();
// Contorllo la presenza dei vertici che siano già esistenti.
if (!((containsVertex(v1)) && (containsVertex(v2)))) return false;
// Data la presenza dei due vertici continua pure il tutto.
// Acquisiamo la lista di adiacenza del vertice 1
HashSet<Vertex> neighboorsAdjacencyMap = adjacencyMap.get(v1);
// Controlliamo che sia presente v2 nella lista di adiacenza di V1
if (!neighboorsAdjacencyMap.contains(v2)) return false; // V2 non è contenuto nella lista di adicenza di v2 pertanto non può essere rimosso perchè l'arco non esiste
// Data la presenza del vertice in v2, procediamo alla rimozione di v2.
neighboorsAdjacencyMap.remove(v2);
return true;
}
@Override
public boolean addEdge(Vertex v1, Vertex v2) {
// Null check
if (v1 == null || v2 == null) throw new NullPointerException();
// Controllo la presenza dei due vertici
if (!(containsVertex(v1) && containsVertex(v2))) return false;
// Data la presenza dei due vertici continua ad aggiungere l'arco tra i due vertici
// Arco v1 -> v2, quindi v2 deve essere aggiunto dentro alla lista di adiacenza di v1
HashSet<Vertex> neighboorsAdjacencyMap = adjacencyMap.get(v1);
return neighboorsAdjacencyMap.add(v2);
}
@Override
public Set<Vertex> neighbors (Vertex v){
// Null check
if (v == null) throw new NullPointerException();
// Verifichiamo che il vertice esista
if (!(containsVertex(v))) return null;
// Data la presenza di v1, si restituisca la lista di adiacenza
return adjacencyMap.get(v);
}
@Override
public Iterator<Vertex> iterator(){
return new UnweightNetworkIterator();
}
protected class UnweightNetworkIterator implements Iterator<Vertex> {
// VARIABILI
private Vertex currentVertex;
private Iterator<Vertex> iterator;
// Costruttore
public UnweightNetworkIterator() {
iterator = adjacencyMap.keySet().iterator();
}
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public Vertex next() {
currentVertex = iterator.next();
return currentVertex;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
@Override
public Iterator<Vertex> breadthFirstIterator (Vertex vertex){
if (!this.adjacencyMap.containsKey(vertex)) throw new IllegalArgumentException();
return new BreadthFirstIterator(vertex);
}
protected class BreadthFirstIterator implements Iterator<Vertex> {
// Variabili
protected Queue<Vertex> queue;
protected HashMap<Vertex, Boolean> research;
protected Vertex currentVertex;
// Costruttore
public BreadthFirstIterator(Vertex vertex) {
this.queue = new LinkedList<Vertex>();
this.research = new HashMap<Vertex, Boolean>();
for (Vertex v : adjacencyMap.keySet()) {
this.research.put(v, false);
}
this.queue.add(vertex);
this.research.put(vertex, true);
}
public boolean hasNext() {
return !this.queue.isEmpty();
}
public Vertex next() {
currentVertex = this.queue.remove();
Set<Vertex> neighborsSet = adjacencyMap.get(currentVertex);
for (Vertex v : neighborsSet) {
if (this.research.get(v)) continue;
this.research.put(v, true);
queue.add(v);
}
return currentVertex;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
public Iterator<Vertex> depthFisrtIterator (Vertex v) {
if (!this.adjacencyMap.containsKey(v)) throw new IllegalArgumentException();
return null; //TODO
}
protected class DepthFirstIterator implements Iterator<Vertex>{
// Variabili
protected Stack<Vertex> stack = new Stack<Vertex>();
protected HashMap<Vertex, Boolean> reached;
Vertex current;
// Costruttore
public DepthFirstIterator(Vertex vertex) {
this.stack = new Stack<Vertex>();
this.reached = new HashMap<Vertex, Boolean>();
for (Vertex v : adjacencyMap.keySet()) {
this.reached.put(v, false);
}
this.stack.add(vertex);
this.reached.put(vertex, true);
}
public boolean hasNext() {
return !stack.isEmpty();
}
public Vertex next() {
this.current = this.stack.pop();
Set<Vertex> neighborsSet = adjacencyMap.get(this.current);
for (Vertex v : neighborsSet) {
if (this.reached.get(v)) {
if (this.stack.remove(v)) stack.add(v);
} else {
this.stack.add(v);
this.reached.put(v, true);
}
}
return current;
}
public void remove() {
throw new UnsupportedOperationException();
}
}
}
@@ -0,0 +1,48 @@
package network.undirected_network;
import java.util.Iterator;
import network.network.Network;
public class UndirectedNetwork<Vertex extends Comparable<? super Vertex>> extends Network<Vertex> {
public UndirectedNetwork() {
super();
}
public UndirectedNetwork(UndirectedNetwork<Vertex> network) {
super(network);
}
public boolean equals(Object object) {
if (object == null) return false;
if (object == this) return true;
if (!(object instanceof UndirectedNetwork)) return false;
UndirectedNetwork<?> undirectedNetwork = (UndirectedNetwork<?>) object;
return this.adjacencyMap.equals(undirectedNetwork.adjacencyMap);
}
@Override
public boolean addEdge(Vertex v1, Vertex v2, Double weight) {
return super.addEdge(v1, v2, weight) && super.addEdge(v2, v1, weight);
}
@Override
public boolean removeEdge(Vertex v1, Vertex v2) {
return super.removeEdge(v1, v2) && super.removeEdge(v2, v1);
}
public boolean isConnected() {
Vertex v = adjacencyMap.firstKey();
Iterator<Vertex> it = new BreadthFirstIterator(v);
int counter = 0;
while (it.hasNext()) counter++;
if (counter < adjacencyMap.size()) return false;
return true;
}
}
+35
View File
@@ -0,0 +1,35 @@
package parziale.p231110;
import java.util.Map;
import java.util.HashMap;
public class Esercizio {
/*
* Scrivere un metodo generico statico che prende in input
* un array di elementi e restituisce il
* numero di oggetti presenti allinterno dellarray che
* non presentano duplicazioni. Quindi
* utilizzare il metodo sul tipo Integer.
* Esempio: se larray fosse {10, 6, 5, 6, 7, 8, 6, 8, 10, 12, 10},
* il metodo dovrebbe restituire
* lintero 3 (in grassetto i 3 elementi che non presentano duplicazioni).
*/
public static int numeroOccorrenzeSingole(int[] array) {
if (array == null) throw new NullPointerException();
Map<Integer, Integer> lista = new HashMap<Integer, Integer>();
for (Integer i : array) {
if (lista.get(i) == null) lista.put(i, 1);
else lista.put(i, lista.get(i) + 1);
}
int counter = 0;
for (Integer i : lista.keySet()) {
if (lista.get(i) == 1) counter++;
}
return counter;
}
}
+116
View File
@@ -0,0 +1,116 @@
package parziale.p231110;
import java.lang.Integer;
import java.util.Comparator;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.Map;
import java.util.TreeMap;
public class Libreria {
/*
* Libreria che rappresenta una libreria
* come una lista di libri senza duplicati e
* supporta le seguenti operazioni.
*/
Set<Libro> libreria = new HashSet<Libro>();
/*
* Metodo n.1
* inserire nella libreria un nuovo libro, se non è già presente,
* dati in input lISBN e lanno
* di pubblicazione;
*/
public boolean aggiungiLibro(Libro libro) {
if (libro == null) throw new NullPointerException();
return libreria.add(libro);
}
/*
* verificare se la libreria contiene un libro,
* dato in input il suo ISBN;
*/
public boolean contieneLibro(String ISBN) {
return libreria.contains(new Libro(ISBN, 0));
}
/*
* cancellare dalla libreria un libro, se presente,
* dato in input il suo ISBN;
*/
public boolean rimuoviLibro(String ISBN) {
return libreria.remove(new Libro(ISBN, 0));
}
/*
* ordinare la lista dei libri in ordine
* crescente rispetto al codice ISBN;
*/
public List<Libro> listaOrdinata() {
List<Libro> listaOrdinata = new ArrayList<Libro>(libreria);
if (libreria.isEmpty()) return listaOrdinata;
Collections.sort(listaOrdinata, new Comparator<Libro>() {
@Override
public int compare(Libro l1, Libro l2) {
String ISBN1 = l1.ISBN();
String ISBN2 = l2.ISBN();
return ISBN1.compareTo(ISBN2);
}
});
return listaOrdinata;
}
/*
* ordinare la lista dei libri in ordine decrescente
* rispetto allanno di prima pubblicazione;
*/
public List<Libro> listaOrdinataPerAnnoDec() {
List<Libro> listaOrdinata = new ArrayList<Libro>(libreria);
if (libreria.isEmpty()) return listaOrdinata;
Collections.sort(listaOrdinata, new Comparator<Libro>() {
@Override
public int compare(Libro l1, Libro l2) {
int anno1 = l1.annoPubblicazione();
int anno2 = l2.annoPubblicazione();
return Integer.compare(anno2, anno1);
}
});
return listaOrdinata;
}
/*
* calcolare restituire in output, per ogni anno di
* pubblicazione compreso tra il 2000 e il
* 2023, il relativo numero di libri contenuti nella libreria.
*/
public Map<Integer, Integer> numeroLibriTra2000e2023() {
// Anno Libro (Integer), Numero di occorrenze (Integer)
Map<Integer, Integer> mappaOrdinata = new TreeMap<Integer, Integer>();
for (Libro libro : libreria) {
int anno = libro.annoPubblicazione();
if (!(anno >= 2000 && anno <= 2023)) continue;
if (mappaOrdinata.get(anno) == null) mappaOrdinata.put(anno, 1);
else mappaOrdinata.put(anno, 1 + mappaOrdinata.get(anno));
}
return mappaOrdinata;
}
}
+45
View File
@@ -0,0 +1,45 @@
package parziale.p231110;
import java.util.Objects;
public class Libro{
// Metodi di instanza
private String ISBN;
private int annoPubblicazione;
// Metodo costruttore
public Libro(
String ISBN,
int annoPubblicazione) {
this.ISBN = ISBN;
this.annoPubblicazione = annoPubblicazione;
}
// Metodi getter
public String ISBN() {
return ISBN;
}
public int annoPubblicazione() {
return annoPubblicazione;
}
// Metodi di oggetto (fondamentali per HashSet usato in Libreria)
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj == this) return true;
if (!(obj instanceof Libro)) return false;
Libro extObj = (Libro) obj;
return this.ISBN.equals(extObj.ISBN);
}
@Override
public int hashCode() {
return Objects.hash(ISBN);
}
}