Компаратор - хорошая вещь. Он имеет static
для этой конкретной проблемы. В вашем случае это было бы
listOfNeighbours.sort(Comparator.comparing(Vertex::getElement))
Если ваш компонент Vertex не Comparable
, я бы предложил вместо этого static
, который можно подавать с помощью специального компаратора. [ 1118]
Например,
import java.util.*;
import javafx.beans.property.*;
public class Vertex{
private ObjectProperty element;
private BooleanProperty visited;
public Vertex() {
element = null;
visited = new SimpleBooleanProperty(false);
}
public Vertex(T element) {
this.element = new SimpleObjectProperty(element);
this.visited = new SimpleBooleanProperty(false);
}
public Vertex(T element, boolean visited) {
this.element = new SimpleObjectProperty(element);
this.visited = new SimpleBooleanProperty(visited);
}
public void setElement(T elem) {
this.element.set(elem);
}
public T getElement() {
return this.element.get();
}
public ObjectProperty elementProperty(){
return this.element;
}
public void setVisited(boolean b) {
this.visited.set(b);
}
public boolean isVisited() {
return this.visited.get();
}
public BooleanProperty visitedProperty(){
return this.visited;
}
@Override
public boolean equals(Object o) {
if(o == this) {
return true;
}
if(!(o instanceof Vertex>)) {
return false;
}
Vertex> v= (Vertex>) o;
if(v.getElement() instanceof String) {
return v.getElement().equals(this.element.get());
}else {
return v.getElement() == this.element.get();
}
}
@Override
public String toString() {
return element.get().toString();
}
public static void main(String[] args) {
ArrayList> listOfNeighbours = new ArrayList<>();
listOfNeighbours.add(new Vertex<>("foo"));
listOfNeighbours.add(new Vertex<>("bar"));
System.out.println(listOfNeighbours);
listOfNeighbours.sort(Comparator.comparing(Vertex::getElement));
System.out.println(listOfNeighbours);
ArrayList> list2 = new ArrayList<>();
list2.add(new Vertex<>(1));
list2.add(new Vertex<>(123));
list2.add(new Vertex<>(15));
list2.add(new Vertex<>(2));
System.out.println(list2);
list2.sort(Comparator.comparing(Vertex::getElement));
System.out.println(list2);
list2.sort(Comparator.comparing(Vertex::getElement, Comparator.comparing(i -> i.toString())));
System.out.println(list2);
}
}
будет, как это можно сделать (протестировано с https://www.compilejava.net/ ).
Результаты:
[foo, bar]
(исходный ввод)
[bar, foo]
(отсортировано по строке)
[1, 123, 15, 2]
(исходный ввод)
[ 115]
(отсортировано по натуральному целочисленному порядку)
[1, 123, 15, 2]
(отсортировано по порядку, заданному для строки, то есть лексикографически).
Последнее выполняется с помощью Comparator
, который выполняет свою работу, извлекая значение из заданного Vertex
, а затем преобразовывая его в String
, который затем используется в качестве ключа сортировки.
Вы корректны в этом, это - потому что у Вас нет административных полномочий. Можно решить это путем установки сервиса при локальном пользователе системы и выполнения пользовательской команды против него по мере необходимости.
В Вашем приложении форм окон:
private enum SimpleServiceCustomCommands { KillProcess = 128 };
ServiceControllerPermission scp = new ServiceControllerPermission(ServiceControllerPermissionAccess.Control, Environment.MachineName, "SERVICE_NAME");
scp.Assert();
System.ServiceProcess.ServiceController serviceCon = new System.ServiceProcess.ServiceController("SERVICE_NAME", Environment.MachineName);
serviceCon.ExecuteCommand((int)SimpleServiceCustomCommands.KillProcess);
myProcess = System.Diagnostics.Process.Start(psi);
В Вашем сервисе:
private enum SimpleServiceCustomCommands { KillProcess = 128 };
protected override void OnCustomCommand(int command)
{
switch (command)
{
case (int)SimpleServiceCustomCommands.KillProcess:
if(killProcess)
{
System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("MyProcessName");
// Before starting the new process make sure no other MyProcessName is running.
foreach (System.Diagnostics.Process p in process)
{
p.Kill();
}
}
break;
default:
break;
}
}
Я добавлю код для предложения Simon Buchan. Это имеет смысл и должно работать также, принятие Вашей формы окон - то, что запустило процесс во-первых.
Вот то, где Вы создаете процесс. Заметьте переменную myProc. Это - Ваш дескриптор на нем:
System.Diagnostics.Process myProc = new System.Diagnostics.Process();
myProc.EnableRaisingEvents=false;
myProc.StartInfo.FileName="PATH_TO_EXE";
myProc.Start();
Позже, просто уничтожьте его с:
myProc.Kill();